有许多未UIColor公开的方法可以公开其他颜色或功能。这些可以在UIColor私有头文件中找到。我将记录两个私有方法styleString()和的使用_systemDestructiveTintColor()。
从iOS 2.0开始,UIColor调用了一个私有实例方法,styleString该方法返回颜色的RGB或RGBA字符串表示形式,即使对于whiteColorRGB空间之外的颜色也是如此。
目标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使用private方法和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)上有一个未记录的类的方法UIColor调用_systemDestructiveTintColor,其将返回由破坏性的系统按钮中使用的红色:
let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue()它返回一个非托管对象,您必须调用该对象,因为颜色所有权尚未转移到我们自己的对象中。.takeUnretainedValue()
与任何未公开的API一样,尝试使用此方法时应格外小心:
if UIColor.respondsToSelector("_systemDestructiveTintColor") {
if let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue() as? UIColor {
// 使用颜色
}
}或使用协议:
@objc protocol UIColorPrivateStatic {
func _systemDestructiveTintColor() -> UIColor
}
let privateClass =UIColor.selfas! UIColorPrivateStatic
privateClass._systemDestructiveTintColor() // UIDeviceRGBColorSpace 1 0.231373 0.188235 1