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

70

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


1
我知道你指定了“通过代码”,但我认为重要的是提到在Storyboard文件检查器中有一个全局色调属性。 - Flores Robles
9个回答

114

只需要在您的应用程序委托中更改UIWindowtintColor,它将自动传递为默认值到所有其UIView后代。

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

你是对的,非常简单,只需添加 _window.tintColor = [UIColor purpleColor]; (autosynthesize) 但我能从其他视图更改它吗? - elGeekalpha
它可以在任何 UIView 上实现,因此您可以将其设置在视图层次结构中的任何视图上,并且所有后代都将继承相同的默认 tintColor(除非您另有指定)。 - Vinzzz
1
重要提示:不要忘记测试选择器是否兼容ios6:if([window respondsToSelector:@selector(setTintColor:)]) - Martin
2
然而,这种方法似乎无法传播到导航工具栏。 - PapillonUK
任何自定义的xib都不会受到UIWindowtintColor属性或全局色调的影响,就像另一个选项所建议的那样。设置UIView的外观代理来设置tintColor是有效的。 - atastrophic
1
你应该使用外观协议,就像@carmen_munich在这里解释的那样:https://dev59.com/tGMk5IYBdhLWcg3wyw7H#19140595 - Darrarski

69

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


3
如果您需要为UIAlertView按钮着色而不仅仅是主应用程序窗口,那么这就是最好的答案! - d60402
4
UIViewtintColor 没有 UI_APPEARANCE_SELECTOR 注释。这个答案是错误的。 - Piotr Tobolski
2
我认为这应该是正确的答案,因为它影响了UIAlertView,而被接受的答案则没有。 - Joshua
2
@Tobol在技术上是正确的。关于这个问题存在一些混淆,它确实需要苹果进行澄清。UIAppearance在iOS 5中被引入作为处理全局颜色(等等)的一种方式,但随后在iOS 7中,苹果将tintColor移动到了UIView并使其传播到子视图。在iOS 7 UI Transition Guide中,苹果声明:“在iOS 7中不支持使用外观代理API设置tintColor属性。”然而,它似乎仍然可以工作。 - Jamie McDaniel
谢谢Jamie。我认为我们应该将其定义为未定义行为,因为它可能会在未来的iOS更新中没有警告地发生变化。 - Piotr Tobolski
显示剩余4条评论

39

改变全局色调有两种方法。如上所述,您可以在-application:didFinishLaunchingWithOptions:中更改self.window.tintColor

我认为更优雅的方法是在没有选定任何内容的情况下,在您的Storyboard中的文件检查器中设置全局色调。这样,您的-application:didFinishLaunchingWithOptions:会更加简洁。

文件检查器中的全局色调


任何自定义的 XIB 文件都不会被 UIWindow 的 tintColor 属性或您所建议的全局色彩影响。 - atastrophic
不确定为什么更改Storyboard选项没有起作用,但是 self.window?.tintColor = UIColor(netHex: 0xc0392b) 起了作用。 - Salah Alshaal
2
如果Xcode是正常的话那将是太棒了。可能这会在Xcode 345版本上运行。今天,果然如此,Xcode实在是让我失望,什么也没有做。我希望苹果能在不久的将来解雇那位恶魔从开发工具负责人的职位上。 - Duck
我理解你,兄弟/姐妹。 - Nestor

12

你可以通过设置窗口的色调属性,为整个应用程序指定一种色调颜色。要做到这一点,你可以使用类似以下代码的方式:

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

5

已更新至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()

2

已更新至Swift 5

在App Delegate中编写以下内容:

self.window?.tintColor = UIColor.green

0
在现代的基于UIScene的应用程序中,您必须遍历所有场景中的所有窗口,使用以下代码设置整个运行应用程序的tintColor:
for scene in UIApplication.shared.connectedScenes {
    if let windows = (scene as? UIWindowScene)?.windows {
        for window in windows {
            window.tintColor = .green
        }
    }
}

0
 UIView.appearance().tintColor = .green

this相同,但使用Swift语言


-1

以下方法对我没有用

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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接