如何通过编程获取iOS 7默认的蓝色?

229

我正在创建我的应用程序中的自定义元素,希望与新版iOS的外观和感觉相匹配。 iOS 7向我们介绍了非常普遍的浅蓝色,这是几个元素的默认颜色或色调,包括系统按钮、分段控制等。他们使用IB很容易选择颜色,如下图所示:

enter image description here

然而,我没有找到如何通过编程方式轻松访问该颜色。我查看了UIColor文档,在类本身中似乎没有任何访问蓝色系统颜色的访问器。

这里是我的问题:是否存在此颜色的简单访问器?[UIColor ?]或类似的东西?如果不存在,有人知道该颜色的确切RGB值吗?

15个回答

257

从视图控制器中使用self.view.tintColor,或者从UIView子类中使用self.tintColor


6
我本想说你可以使用UIView().tintColor,但实际上不能。不确定何时设置了UIView的色调颜色... - Dan Rosenstark
1
@DanRosenstark 我认为 UIWindow 或者它的根视图有原始版本。视图从响应链中更高的视图继承其色调颜色,但在你的例子中新视图没有父视图。 - Aaron Brager
2
UIViewController.viewDidLoad()中使用self.view.tintColor可以得到正确的蓝色。 - Nicolas Miari

234

看起来是 [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0]

显示颜色窗口的截图


2
有趣的是,使用相同的工具,在我的系统上默认的蓝色似乎是0:128:255。我想知道苹果最近是否进行了更改? - Joel H.
@JoelH,请检查您当前使用的颜色空间。 - Richard J. Ross III
19
请注意如何使用这个,因为它可能会在随后的iOS版本中发生变化。 - Zev Eisenberg
7
硬编码任何可能会更改的值绝对不是一个好主意,特别是当存在一个API可以查询实际值时。 - Nicolas Miari
1
Swift版本 UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0) - Doug Amos

91

iOS 7 默认的蓝色颜色是 R:0.0 G:122.0 B:255.0

UIColor *ios7BlueColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];

51
如果您喜欢十六进制的话,可以使用0x007aff - Jason Moore
4
如果苹果更改默认色调或允许用户设置默认色调,你的应用将无法获取正确的颜色,这不太具有未来性。 - prewett
4
只返回翻译后的文本:和在另一个系统中:#007AFF - daleijn
3
在Swift中,以下代码表示默认的颜色为:UIColor(red: 0.0, green: 122/255, blue: 1.0, alpha: 1)。 - Jervisbay

52

根据UIButton文档:

iOS v7.0中,所有UIView的子类都从基类继承tintColor行为。有关更多信息,请参见UIView级别的tintColor讨论。

假设您在获取默认值之前不更改tintColor,则可以使用:

self.view.tintColor

看起来抓取颜色的最安全方式。 - Cliff Helsel
这对我有用。我的sharedApplication()没有带有tintColorkeyWindow - SimplGy

26

这里有一个获取默认系统色调颜色的简单方法:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}

你不需要为主线程的事情调度一次。一个简单的if nil就足够了。 - malhal
6
为什么假设该方法只会从主线程调用?dispatch_once的开销非常低,并且在普通情况下只需要进行一次if检查。 - Rick
@AndreyTarantsov 这是真的,但在多个线程上使用UIColor是安全的。将其包装在dispatch_once中允许在任何线程上安全地检索此颜色。而且,开销非常低。 - Rick
3
根据快速测试结果看起来正常。根据UIVIew文档:"对应用程序界面的操作必须在主线程上进行。因此,您应该始终从在应用程序的主线程中运行的代码调用UIView类的方法。唯一不严格需要这样做的时间是创建视图对象本身的时候,但所有其他操作都应在主线程上执行。" - Rick
@Rick 快速测试并不能真正帮助这里。然而,文档似乎表明您的用法可能是正确的。因此,我撤回我的抱怨,并且只留下一个一般性建议,避免那些会引起麻烦的事情。 - Andrey Tarantsov
显示剩余2条评论

22

19

Swift 4 的方式:

extension UIColor {
  static let system = UIView().tintColor!
}

我强烈不建议您使用强制解包,因为如果UIKit框架的默认行为在任何下一个版本中更改,它可能会导致应用程序崩溃。此外,从UIView实例获取色调颜色不能保证这种颜色是系统色调颜色。 - Stanislau Baranouski
1
@StanislauBaranouski 为什么他们应该改变那个?请解释一下你的观点。 - Dmitry Kozlov
尽量避免强制解包,特别是在可以避免的情况下,这是一种不好的编程实践。 - Stanislau Baranouski

17

使用预定义的系统颜色创建本机扩展程序,可以得到您想要的效果:

// System colors

extension UIColor {

   
    /* Some colors that are used by system elements and applications.
     * These return named colors whose values may vary between different contexts and releases.
     * Do not make assumptions about the color spaces or actual colors used.
     */
    
    ... 

    @available(iOS 7.0, *)
    open class var systemBlue: UIColor { get }
    ... 
}

您可以直接使用:

myView.tintColor = .systemBlue

1
每次调用 systemBlue 都会创建一个 UIButton,最好在初始化时只初始化一次此颜色。在内部扩展中使用内部单词不太用户友好。使用类而不是静态类也是如此。而且将其称为“蓝色”是不正确的,因为此颜色以后可能会像在 macOS Mojave 中一样更改。因此,static let system = UIView().tintColor! 仍然比您的变体要好得多。 - Dmitry Kozlov
@DmitryKozlov 你说得对,由于内存性能更好,最好使用静态。感谢您指出这一点。但是,在iOS 12之前,将其称为“蓝色”仍然有效,并且与macOS无关。对于macOS,您必须处理NSColor类型。 - Stanislau Baranouski

14

通过使用此代码,自动获取颜色:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!

10

UIWindow.tintColor 方法在 iOS8 中对我无效(仍然是黑色),所以我不得不这样做:

let b = UIButton.buttonWithType(UIButtonType.System) as UIButton
var color = b.titleColorForState(.Normal)

这给了UIBarButtonItem中所看到的正确蓝色色调。


感觉有点不太好,但这比硬编码一个随时间可能会改变的链接颜色要好。 - timgcarlson

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