ChatGPT解决这个技术问题 Extra ChatGPT

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

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

https://i.stack.imgur.com/deFsk.png

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

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


A
Aaron Brager

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


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

它似乎是 [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0]

https://i.stack.imgur.com/nb08q.png


有趣的是,我系统上的默认蓝色似乎是 0:128:255(使用相同的工具)。我想知道Apple最近是否改变了它?
@乔尔H。检查您当前使用的色彩空间。
请谨慎使用它,因为它可能会在后续的 iOS 版本中发生变化。
是的,对任何可能发生变化的值进行硬编码绝对不是一个好主意。尤其是当有 API 来查询实际值时。
斯威夫特版本 UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
r
rdurand

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)
J
Josh Tynjala

根据 UIButton 的文档:

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

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

self.view.tintColor

看起来是最安全的获取颜色的方法。
这对我有用。我的 sharedApplication() 没有 keyWindowtintColor
R
Rick

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

+ (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 类的方法。唯一一次可能不会绝对必要的是在创建视图对象本身时,但所有其他操作都应该发生在主线程上。”
E
Ego Slayer

十六进制颜色代码

#007AFF

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

附言。 iOS、斯威夫特


D
Dmitry Kozlov

快速4路:

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

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

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

// 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 类型。
L
Lukasz Czerwinski

使用以下代码自动获取颜色:

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

c
cscott530

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

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

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


感觉有点脏,但它比硬编码可能随时间变化的链接颜色要好。
C
Codecraft Studio

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

self.view.tintColor

或者,如果您需要 CGColor:

self.view.tintColor.CGColor

A
Ali

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

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

或迅速

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

self.view.tintColor 更有可能
E
Ely

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

UIColor.systemBlue

A
Anurag Soni

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

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

为什么需要为每个 rgb 值写入 /255.0
因为 Mac 上的颜色是介于 0.0 和 1.0 之间的浮点数。
R
Renaud Boisjoly

通过以下方式将类别添加到 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; 中从 bluered