目标c -覆盖Swift uiccolor类函数



我正试图在Swift 1.2中为我的iOS应用程序实现"黑暗"模式功能,我正在考虑编写UIColor的扩展或子类。我想知道是否有可能重写UIColor.whiteColor(), UIColor.blackColor()和其他内置颜色。如果不是,那还有什么更好的方法来完成整个应用的黑暗模式呢?下面的代码不能作为扩展使用。

class func whiteColor() -> UIColor {
    return UIColor(...)
}

,因为它与UIColor中现有的whiteColor()声明冲突。

谢谢!

这是Swift 3对你问题中"override"部分的回答。下面的代码片段包含占位符。它将系统实现与您自己的实现交换。

extension UIColor {
    // ******************************************************************
    // MARK: - Override black with own implementation
    // ******************************************************************
    override open class func initialize() {
        if self == UIColor.self {
            let blackMethod = class_getClassMethod(self, #selector(getter: black))
            let myBlackMethod = class_getClassMethod(self, #selector(getter: myBlack))
            method_exchangeImplementations(blackMethod, myBlackMethod)
            let whiteMethod = class_getClassMethod(self, #selector(getter: white))
            let myWhiteMethod = class_getClassMethod(self, #selector(getter: myWhite))
            method_exchangeImplementations(whiteMethod, myWhiteMethod)
        }
    }
    // for a light background
    open class var myBlack: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }
    // for a dark background
    open class var myWhite: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }
}

initialize的重写不再工作了,所以我将为Swift 4:

提供一个解决方案。
extension UIColor {
    // ******************************************************************
    // MARK: - Override black with own implementation
    // ******************************************************************
    static let classInit: Void = {
        let blackMethod = class_getClassMethod(UIColor.self, #selector(getter: black))
        let myBlackMethod = class_getClassMethod(UIColor.self, #selector(getter: myBlack))
        method_exchangeImplementations(blackMethod, myBlackMethod)
        let whiteMethod = class_getClassMethod(UIColor.self, #selector(getter: white))
        let myWhiteMethod = class_getClassMethod(UIColor.self, #selector(getter: myWhite))
        method_exchangeImplementations(whiteMethod, myWhiteMethod)
    }()
    // for a light background
    open class var myBlack: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }
    // for a dark background
    open class var myWhite: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }
}

AppDelegate初始化之后,您将这些方法混合:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    override init() {
        super.init()
        UIColor.classInit
    }
    ...
}

最好的解决方案是编写一个ColorScheme类来存储您的颜色(例如labelColor, backgroundColor,…)。当你将ColorScheme更改为"dark mode"时,只需设置新颜色并推送一个NSNotification。你的视图控制器应该听取它的意见,并将标签、背景等的颜色设置为新的值。

另一种方法是编写自己的UIColor扩展。

在Swift 3中,预定义的UIColors被相应地使用:

var myColor: UIColor = .white // or .clear or whatever

因此,如果您想要类似的内容,例如以下…

var myColor: UIColor = .myCustomColor

…然后,您将像这样定义扩展名:

extension UIColor
    {
    public class var myCustomColor: UIColor
        {
        return UIColor(red: 248/255, green: 248/255, blue: 248/255, alpha: 1.0)
        }
    }

事实上,苹果将白色定义为:

public class var white: UIColor

相关内容

  • 没有找到相关文章

最新更新