未記載的方法
在 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