iOS 未记录的方法
示例
有许多未UIColor公开的方法可以公开其他颜色或功能。这些可以在UIColor私有头文件中找到。我将记录两个私有方法styleString()和的使用_systemDestructiveTintColor()。
styleString
从iOS2.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方法和unsafeBitCastUIColor以下协议创建协议:
@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 { //使用颜色 } }
或使用协议:
@objc protocol UIColorPrivateStatic { func _systemDestructiveTintColor() -> UIColor } let privateClass =UIColor.selfas! UIColorPrivateStatic privateClass._systemDestructiveTintColor() //UIDeviceRGBColorSpace10.2313730.1882351