有许多未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