【问题标题】:How can I get the iOS 7 default blue color programmatically?如何以编程方式获取 iOS 7 默认蓝色?
【发布时间】:2013-10-02 16:46:42
【问题描述】:

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

但是,我还没有找到如何以编程方式轻松访问颜色。我查看了UIColor documentation,在类本身中似乎没有任何蓝色系统颜色的访问器。

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

【问题讨论】:

    标签: ios colors ios7 uicolor


    【解决方案1】:

    具有预定义系统颜色的本机扩展提供您正在寻找的内容:

    // 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
    

    【讨论】:

    • 每次你请求 systemBlue 时都会创建 UIButton ,最好初始化这个颜色一次。在内部扩展中使用内部词对用户不友好。使用类而不是静态的也是如此。并称它为“蓝色”是不对的,因为这种颜色可以在以后更改,就像在 macOS Mojave 中一样。所以static let system = UIView().tintColor! 还是比你的变种好很多。
    • @DmitryKozlov 你说得对,最好使用静态内存性能。感谢您指出这一点。但在 iOS 12 之前将其称为“蓝色”仍然有效,并且与 macOS 完全无关。对于 macOS,您必须处理 NSColor 类型。
    【解决方案2】:

    请不要乱用view.tintColor 或扩展名,只需使用这个:

    UIColor.systemBlue
    

    【讨论】:

      【解决方案3】:

      快速 4 路:

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

      【讨论】:

      • 我强烈不建议您使用强制解包,因为如果 UIKit Framework 的默认行为在任何下一个版本中发生更改,它可能会导致应用程序崩溃。从 UIView 实例获取色调颜色也不能保证该颜色是系统色调颜色。
      • @StanislauBaranouski 为什么他们应该改变它?请解释你的观点
      • 这里不需要解释,使用强制展开只是一种不好的做法,尤其是如果你可以避免的话。
      【解决方案4】:

      通过以下方式将类别添加到 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,以进一步了解如何回答。即:“没有从根本上回答问题的答案”:仅仅是指向外部网站的链接
      • 呃,我们是怎么从+ (instancetype)iOS7redColor; 中的blue 变成red
      【解决方案5】:

      十六进制颜色代码

      #007AFF
      

      你需要这个库 https://github.com/thii/SwiftHEXColors

      ps。 iOS、斯威夫特

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          使用来自视图控制器的self.view.tintColor,或来自UIView 子类的self.tintColor

          【讨论】:

          • 我想说你可以只使用UIView().tintColor,但实际上你不能。不确定 UIView 在什么时候设置了 tint color ...
          • @DanRosenstark 我认为UIWindow 或者它的根视图具有原始版本。视图从响应者链中的更高视图继承其色调颜色,但在您的示例中,新视图没有超级视图。
          • self.view.tintColor from inside UIViewController.viewDidLoad() 给出正确的蓝色。
          【解决方案8】:

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

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

          或快速

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

          【讨论】:

          • self.view.tintColor 更有可能
          【解决方案9】:

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

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

          这给出了在 UIBarButtonItem 中看到的正确蓝色调

          【讨论】:

          • 感觉有点脏,但总比硬编码可能随时间变化的链接颜色好。
          【解决方案10】:

          根据 UIButton 的文档:

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

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

          self.view.tintColor
          

          【讨论】:

          • 看起来是最安全的颜色获取方式。
          • 这对我有用。我的sharedApplication() 没有keyWindowtintColor
          【解决方案11】:

          从 iOS 7 开始,有一个 API,您可以通过以下方式获取(和设置)色调:

          self.view.tintColor
          

          或者如果您需要 CGColor:

          self.view.tintColor.CGColor
          

          【讨论】:

            【解决方案12】:

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

            + (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 就足够了。
            • 为什么假设该方法只会从主线程调用? dispatch_once 的开销非常低,并且在常见情况下是单个 if 检查。
            • @Rick 因为 UIKit API 不是后台线程安全的,所以无论如何都不允许在主线程之外调用它。
            • @AndreyTarantsov 确实如此,但在多个线程上使用UIColor 安全的。将其包裹在 dispatch_once 中允许在任何线程上安全地检索此颜色。同样,开销非常低。
            • @AndreyTarantsov 通过快速测试,它似乎工作正常。来自 UIVIew documentation:“对应用程序用户界面的操作必须在主线程上进行。因此,您应该始终从运行在应用程序主线程中的代码调用 UIView 类的方法。唯一一次可能不会绝对必要的是在创建视图对象本身时,但所有其他操作都应该发生在主线程上。"
            【解决方案13】:

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

            【讨论】:

            • 如果你更喜欢十六进制:0x007aff
            • 这不是未来的证据——如果 Apple 更改默认色调或让用户设置默认色调,您的应用将无法获得正确的颜色。
            • 在另一个系统中:#007AFF
            • 在 Swift 中:让 defaultTintColor = UIColor(red: 0.0, green: 122/255, blue: 1.0, alpha: 1)
            【解决方案14】:

            在设置颜色时,您可以像这样设置颜色

            [UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]
            

            【讨论】:

            • 为什么每个rgb值都需要写/255.0
            • 因为 Mac 上的颜色是介于 0.0 和 1.0 之间的浮点数。
            【解决方案15】:

            好像是[UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0]

            【讨论】:

            • 有趣的是,我系统上的默认蓝色似乎是 0:128:255(使用相同的工具)。不知道苹果最近有没有改过?
            • @JoelH。检查您当前使用的色彩空间。
            • 谨慎使用它,因为它可能会在后续的 iOS 版本中发生变化。
            • 是的,硬编码任何可能改变的值绝对不是一个好主意。尤其是有API可以查询实际值的时候。
            • 斯威夫特版UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
            猜你喜欢
            • 1970-01-01
            • 2011-10-21
            • 2017-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多