【问题标题】:Accessing the system .Destructive red button color访问系统。破坏性红色按钮颜色
【发布时间】:2026-01-13 18:35:01
【问题描述】:

如何访问用于破坏性警报按钮样式的系统红色?

例如,用于按钮的默认样式蓝色可以在 Swift 中通过let systemBlueColor = view.tintColor 访问,它对应于UIColor(red: 0, green: 122, blue: 255, alpha: 1.0)

破坏性的红色似乎是由UIColor(red: 255, green: 59, blue: 48, alpha: 1.0) 给出的,但是有没有办法以类似于默认的view.tintColor 方法的方式访问它?

我已阅读 RGB 解释可能因设备/操作系统而异,因此我想访问与设备/操作系统无关的颜色版本。

【问题讨论】:

    标签: ios swift uicolor


    【解决方案1】:

    UIColor 上有一个未记录的类方法,名为 _systemDestructiveTintColor,它将返回您需要的颜色:

    let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue()
    

    它返回一个非托管对象,您必须调用 .takeUnretainedValue() on,因为颜色所有权尚未转移到我们自己的对象。

    与任何未记录的 API 一样,在尝试使用此方法时应谨慎:

    斯威夫特 5:

    if UIColor.responds(to: Selector(("_systemDestructiveTintColor"))) {
        if let red = UIColor.perform(Selector(("_systemDestructiveTintColor")))?.takeUnretainedValue() as? UIColor {
            // use the color
        }
    }
    

    以前的 Swift 版本:

    if UIColor.respondsToSelector("_systemDestructiveTintColor") {
        if let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue() as? UIColor {
            // use the color
        }
    }
    

    可以在 UIColor header 中找到此颜色和其他颜色。

    【讨论】:

    • 为什么是takeRetainedValue()?从选择器名称来看应该是takeUnretainedValue()
    • @MartinR 我不确定这是获取规则还是复制规则,我想这只是获取规则。我会把答案改成takeUnretainedValue
    • @MartinR “当对象的所有权尚未转移给您时,您使用 takeUnretainedValue,因此您不希望 ARC 在对象超出范围时为您释放该对象。”是的,你是对的。
    • 为什么要强制转换? (Xcode 发出警告“将强制向下转换为 'UIColor' 作为可选将永远不会产生'nil'”。)该方法是否返回(非托管)UIColorUIColor?
    • @MartinR 再次正确,无需强制向下转换。我已经编辑了我的答案。