swift swizzling property 交换系统属性

举例:交换 UINavigationBar 的系统属性 titleTextAttributes

let needSwizzleSelectorArr = [
    // 这里我们要交换的是属性 titleTextAttributes 的 setter 方法
    #selector(setter: titleTextAttributes)
]

for selector in needSwizzleSelectorArr {
    let str = ("wr_" + selector.description)
    let originalMethod = class_getInstanceMethod(self, selector)
    let swizzledMethod = class_getInstanceMethod(self, Selector(str))
    method_exchangeImplementations(originalMethod, swizzledMethod)
}

交换的方法

func wr_setTitleTextAttributes(_ newTitleTextAttributes:[String : Any]?)
{
    guard var attributes = newTitleTextAttributes else {
        return
    }
    
    guard let originTitleTextAttributes = titleTextAttributes else {
        wr_setTitleTextAttributes(attributes)
        return
    }
    
    var titleColor:UIColor?
    for attribute in originTitleTextAttributes {
        if attribute.key == NSForegroundColorAttributeName {
            titleColor = attribute.value as? UIColor
            break
        }
    }
    
    guard let originTitleColor = titleColor else {
        wr_setTitleTextAttributes(attributes)
        return
    }

    if attributes[NSForegroundColorAttributeName] == nil {
        attributes.updateValue(originTitleColor, forKey: NSForegroundColorAttributeName)
    }
    wr_setTitleTextAttributes(attributes)
}


强烈推荐:超简单!!! iOS设置状态栏、导航栏按钮、标题、颜色、透明度,偏移等

https://github.com/wangrui460/WRNavigationBar
https://github.com/wangrui460/WRNavigationBar_swift



欢迎关注我的微博:wangrui460

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容