如何以编程方式获取iOS 7默认蓝色?


223

我正在应用程序中创建自定义元素,并希望与新iOS的外观匹配。iOS 7向我们介绍了一种非常常见的浅蓝色,这是几种元素(包括系统按钮,分段控件等)的默认颜色或色调。它们使使用IB选择颜色变得容易,如下所示:

在此处输入图片说明

但是,我还没有找到如何轻松地以编程方式访问颜色的方法。我签出了UIColor文档,并且在类本身中似乎没有用于蓝色系统颜色的任何访问器。

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

Answers:


252

使用self.view.tintColor从一个视图控制器,或self.tintColor从一个UIView子类。


6
我要说的是您可以使用UIView().tintColor,但实际上您不能。不知道在什么时候UIView会获得色彩设置...
Dan Rosenstark

1
@DanRosenstark我认为,UIWindow或者它的根视图具有原始版本。视图从响应者链中较高的视图继承其色调颜色,但是在您的示例中,新视图没有超级视图。
亚伦·布拉格

2
self.view.tintColor从内部UIViewController.viewDidLoad()给出正确的蓝色。
Nicolas Miari '16

234

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

screenshot showing Colors window


2
有趣的是,我系统上的默认蓝色似乎是0:128:255(使用同一工具)。我想知道苹果最近是否改变了它?
Joel H.

@JoelH。检查您当前正在使用的色彩空间。
理查德·罗斯三世

19
请谨慎使用,因为在以后的iOS版本中可能会更改。
Zev Eisenberg 2014年

7
是的,对可能会更改的任何值进行硬编码绝对不是一个好主意。尤其是当有一个API可以查询实际值时。
Nicolas Miari

1
迅捷版UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos

90

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
这不是很可靠的证明-如果Apple更改了默认色泽颜色或允许用户设置默认色泽颜色,则您的应用将无法获得正确的颜色。
prewett 2015年

4
而在另一个系统中:#007AFF
daleijn 2015年

3
在Swift中:让defaultTintColor = UIColor(红色:0.0,绿色:122/255,蓝色:1.0,alpha:1)
Jervisbay

49

根据UIButton的文档:

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

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

self.view.tintColor

看起来是获取颜色的最安全方法。
克利夫·海塞尔2014年

这对我有用。我sharedApplication()没有keyWindowtintColor
SimplGy'3

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;
}

您不需要为主线程事务调度一次。一个简单的nil就足够了。
malhal 2014年

6
为什么假设该方法仅从主线程调用?to的开销dispatch_once非常低,并且在通常情况下仅需检查一次。
瑞克

@Rick因为UIKit API不是后台线程安全的,所以无论如何都不允许在主线程之外调用它。
Andrey Tarantsov 2014年

@AndreyTarantsov是正确的,但是在多个线程上使用安全的UIColor。将其包装在中dispatch_once可以安全地在任何线程上检索此颜色。同样,开销非常低。
2014年

3
快速测试中的@AndreyTarantsov似乎运行良好。从UIVIew 文档中:“对应用程序用户界面的操作必须在主线程上进行。因此,您应始终从在应用程序主线程中运行的代码中调用UIView类的方法。这可能并非严格如此创建视图对象本身是必需的,但所有其他操作都应在主线程上进行。”
2014年


16

快速4种方式:

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

我强烈不建议您使用强制展开,因为如果在任何下一版本中将更改UIKit Framework的默认行为,这可能会导致应用程序崩溃。同样,从UIView实例获取着色颜色也不能保证此颜色是系统着色颜色。
Stanislau Baranouski '18

@StanislauBaranouski为什么他们应该改变它?请解释您的观点
Dmitry Kozlov

此处无需解释,使用强制展开只是一种不好的做法,尤其是如果可以避免的话。
Stanislau Baranouski '19

15

此扩展为您提供本机系统蓝色。

extension UIColor {

    static var systemBlue: UIColor {
        return UIButton(type: .system).tintColor
    }

}

更新

请忘记我在上面写的内容,只是弄清楚了-我们一直在寻找具有我们一直在寻找的预定义系统颜色的本机扩展,包括系统蓝色

// 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!仍然比您的变体好得多。
德米特里·科兹洛夫

@DmitryKozlov对,您最好使用静态到期内存性能。感谢您指出这一点。但是将其称为“蓝色”仍然可以在iOS 12上使用,并且与macOS完全无关。对于macOS,您必须处理NSColor类型。
Stanislau Baranouski '18


10

UIWindow.tintColor方法在iOS8中对我不起作用(它仍然是黑色的),所以我必须这样做:

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

这给出了在 UIBarButtonItem


感觉有点脏,但是比硬编码可能随时间变化的链接颜色更好。
timgcarlson

7

从iOS 7开始,有一个API,您可以使用以下方法获取(并设置)色彩:

self.view.tintColor

或者,如果您需要CGColor:

self.view.tintColor.CGColor

6

在很多情况下,您需要的只是

[self tintColor] 
// or if in a ViewController
[self.view tintColor]

或迅速

self.tintColor
// or if in a ViewController
self.view.tintColor



2

通过以下方式将类别添加到UIColor可以使它随时可用,甚至在代码中更改其定义:

@interface UIColor (iOS7Colors)

+ (instancetype)iOS7blueColor;

@end

@implementation UIColor (SpecialColors)

+ (instancetype)iOS7blueColor;
{
    return [UIColor colorWithRed:0.0f green:0.22f blue:122.0/255.0 alpha:1.0f];
}

将类别导入代码后,您可以使用以下方法调用颜色:

UIColor *myBlueColor = [UIColor iOSblueColor];

请尝试阅读此stackoverflow.com/help/deleted-answers,以更多地了解如何回答。即:“无法从根本上回答问题的答案”:仅仅是到外部站点的链接
RadimKöhler2013年

呃你怎么从我们获取bluered+ (instancetype)iOS7redColor;
ta.speot.is
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.