objective-c - 覆盖 Swift UIColor 类函数

标签 objective-c iphone xcode swift user-interface

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

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

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

谢谢!

最佳答案

这是针对您问题的“覆盖”部分的 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#>)
    }
}

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
    }

    ...

}

关于objective-c - 覆盖 Swift UIColor 类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320593/

相关文章:

objective-c - ios-在 uiimage 元数据中添加地理定位

iphone - 如何在iOS应用程序中在Google Plus上发布图像

iphone - 从字符串中检索图像 url

iphone - 可以在 iPad 上计算 powerpoint 演示文稿的宽度/高度吗

c++ - 如何构建使用 OpenCV 的 XCode 6 iOS 应用程序 - 未定义错误 __cplusplus

ios - 上下文类型 AnyObject 不能与坐标数组文字一起使用

ios - NSURLSessionDownloadTask 从 http 切换到 https

ios - 如何通过 firebase 中的嵌套值获取键名?

iOS Objective-C 如何绘制只有 'warm colors' 的色轮?

xcode - Swift - 未生成 `.framework` 文件