未記載的方法

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