未记载的方法
在 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