iOS 未记录的方法

示例

有许多未UIColor公开的方法可以公开其他颜色或功能。这些可以在UIColor私有头文件中找到。我将记录两个私有方法styleString()和的使用_systemDestructiveTintColor()。

styleString

从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)

_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() // UIDeviceRGBColorSpace 1 0.231373 0.188235 1