未记载的方法

UIColor 上有各种未记录的方法,它们可以显示其他颜色或功能。这些可以在 UIColor 私有头文件中找到 。我将记录使用两种私有方法 styleString()_systemDestructiveTintColor()

styleString

从 iOS 2.0 开始,在 UIColor 上有一个名为 styleString 的私有实例方法,它返回颜色的 RGB 或 RGBA 字符串表示,即使对于 RGB 空间之外的 whiteColor 这样的颜色也是如此。

Objective-C 的:

@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

在 Swift 中,你可以使用桥接头来显示接口。使用纯 Swift,你需要使用私有方法创建 @objc 协议,并使用协议创建 unsafeBitCast UIColor

@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)

_systemDestructiveTintColor()

UIColor 上有一个名为 _systemDestructiveTintColor 的无证类方法,它将返回破坏性系统按钮使用的红色:

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

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

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

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

或使用协议:

@objc protocol UIColorPrivateStatic {
    func _systemDestructiveTintColor() -> UIColor
}

let privateClass = UIColor.self as! UIColorPrivateStatic
privateClass._systemDestructiveTintColor() // UIDeviceRGBColorSpace 1 0.231373 0.188235 1