更改全局色调颜色-iOS7 / iOS8


69

如何通过代码更改iOS7 / iOS8上的全局色调颜色?我想更改使用此属性的多个对象,但不更改每个对象,这就是为什么要使用全局着色属性。


1
我知道您指定了“按代码”,不过,我认为重要的是要提到情节提要的文件检查器中有一个全局着色属性
Flores Robles

Answers:


113

只需更改UIWindowtintColor应用程序中的代表,它是作为默认为所有的自动传递UIView后代。

[self.window setTintColor:[UIColor greenColor]];

是的,相当简单,只需添加_window.tintColor = [UIColor purpleColor]; (自动合成)但是我可以从其他角度更改它吗?
elGeekalpha 2013年

它是在any上实现的UIView,因此您可以在视图层次结构中的任何视图上设置它,并且其所有后代都将继承相同的默认值tintColor(除非您另外指定)
Vinzzz 2013年

1
重要提示:不要忘记测试选择器的ios6兼容性:if([window respondsToSelector:@selector(setTintColor:)])
马丁

2
但是,此方法似乎不会传播到导航工具栏。
PapillonUK

1
您应该改用外观协议,如@carmen_munich在此处说明:stackoverflow.com/a/19140595/514181
Darrarski

68

[[UIView appearance] setTintColor:[UIColor greenColor]];


3
如果您需要着色UIAlertView按钮,而不仅仅是主应用程序窗口,则这是最佳答案!
2014年

4
UIViewtintColor没有UI_APPEARANCE_SELECTOR注释。这个答案是错误的。
Piotr Tobolski 2014年

2
我认为这应该是正确的答案,因为它会影响UIAlertView,而可接受的答案则不会。
2015年

2
@Tobol在技术上是正确的。对此存在困惑,确实需要苹果公司予以澄清。UIAppearance在iOS 5中引入的一种方式来处理全局颜色(及以上),但随后的iOS 7的苹果移动tintColorUIView并使其传播到子视图。苹果在iOS 7 UI过渡指南中指出:“ iOS 7不支持使用外观代理API设置tintColor属性。” 但是它似乎仍然有效。
Jamie McDaniel 2015年

谢谢杰米。我认为我们应该将此行为定义为未定义的行为,因为它可以在将来的iOS版本中更改而不会发出警告。
Piotr Tobolski 2015年

39

有两种更改全局色的方法。由于许多上面提到你可以改变self.window.tintColor-application:didFinishLaunchingWithOptions:

我认为,更优雅的方法是在未选择任何内容的情况下,在情节提要中的File Inspector中设置Global Tint。这样您就更清洁了。-application:didFinishLaunchingWithOptions:

文件检查器中的全局色调


您所建议的任何自定义xib都不会受到UIWindowtintColor属性或全局色彩的影响。
tGilani

不知道为什么更改情节提要选项不起作用,但是起作用self.window?.tintColor = UIColor(netHex: 0xc0392b)了。
Salah Alshaal

2
如果Xcode起作用,那将是惊人的。可能这将在Xcode 345版上起作用。今天,正如预期的那样,Xcode陷入了困境,什么也不做。我希望苹果能在不久的将来从开发人员工具的头上解雇撒旦。
鸭子

我感觉你兄弟/ sis。
内斯特

12

您可以通过设置窗口的tint属性为整个应用程序指定颜色。为此,您可以使用类似于以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window.tintColor = [UIColor purpleColor];
    return YES;
}

4

为Swift 2.2更新

您可以从任何地方执行以下操作:

// Get app delegate
let sharedApp = UIApplication.sharedApplication()

// Set tint color
sharedApp.delegate?.window??.tintColor = UIColor.green()

或者,如果您尝试通过AppDelegate执行此操作,

self.window?.tintColor = UIColor.green()


0

以下对我没用的东西:

navigationItem.backBarButtonItem?.tintColor = Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR

navigationItem.backBarButtonItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor : Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR], for: .normal)

self.navigationController?.navigationBar.barStyle = UIBarStyle.black

navigationController?.navigationBar.barTintColor = Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR

navigationController?.navigationBar.tintColor = Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR

navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR]

以下工作:

  1. 从故事板上设置全局色调颜色。

要么

  1. 设置窗口的色彩

对于整个应用程序:

let sharedApp = UIApplication.sharedApplication()
sharedApp.delegate?.window??.tintColor = UIColor.green()

对于特定控制器:

在初始化时设置窗口的颜色,并在反初始化时重新设置应用程序的默认颜色。

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        let window = UIApplication.shared.windows.first
        window?.tintColor = Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        let window = UIApplication.shared.windows.first
        window?.tintColor = Theme.light.healthKit.BACK_BUTTON_TITLE_COLOR
    }

    deinit {
        let window = UIApplication.shared.windows.first
        window?.tintColor = Theme.light.App.DEFAULT_TINT_COLOR
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.