覆盖Swift UIColor类函数

时间:2015-07-09 14:33:06

标签: objective-c iphone xcode swift user-interface

我正在尝试在Swift 1.2中为我的iOS应用程序实现“黑暗”模式功能,并且正在考虑编写UIColor的扩展或子类。我想知道是否可以覆盖UIColor.whiteColor(),UIColor.blackColor()和其他内置颜色。如果没有,那么为整个应用程序完成黑暗模式的更好方法是什么?以下代码不适用于扩展名。

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

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

谢谢!

3 个答案:

答案 0 :(得分:1)

最好的解决方案是编写一个存储颜色的ColorScheme类(比如labelColor,backgroundColor,...)。当您将ColorScheme更改为“暗模式”时,只需设置新颜色并推送NSNotification。您的视图控制器应该听取它并将标签,背景等的颜色设置为新值。

答案 1 :(得分:1)

这是您的问题“覆盖”部分的 Swift 3 答案。下面的代码段包含占位符。它将系统实现与您自己的交换。

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#>)
    }
}

初始化的覆盖不再起作用,所以我将为 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
    }

    ...

}

答案 2 :(得分:0)

另一种方法是编写自己的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)
        }
    }

事实上,Apple将white定义为:

public class var white: UIColor