1

我正在尝试调整 UIView 的 init 方法以及任何子类化它的方法。到目前为止,我的尝试只会导致崩溃或根本没有做任何明显的事情。

尝试实现的结果是能够覆盖视图边框颜色和宽度的值,以尝试在不需要附加调试器的情况下可视化视图框架。

4

1 回答 1

1

我以前从未尝试过 swizzling,但我很想尝试一下 - 一个快速的 google 发现了这篇文章,它解释了如何使用extension.

extension UIView {
    
    static let classInit: Void = {
        guard let originalMethod = class_getInstanceMethod(
            UIView.self,
            #selector(layoutSubviews)
        ), let swizzledMethod = class_getInstanceMethod(
            UIView.self,
            #selector(swizzled_layoutSubviews)
        ) else {
            return
        }
       method_exchangeImplementations(originalMethod, swizzledMethod)
    }()

    @objc func swizzled_layoutSubviews() {
        swizzled_layoutSubviews()
        self.layer.borderColor = UIColor.red.cgColor
        self.layer.borderWidth = 2
    }

}

然后,您只需要确保在 AppDelegatedidFinishLaunchingWithOptions方法中或在应用程序开始时的某个地方运行 swizzle

UIView.classInit

在此处输入图像描述

上面的代码在 iOS 13.7 模拟器上对我有用,但从我读过的内容来看,你真的不应该尝试覆盖这样的方法,UIView尤其是从这样的核心对象中,如果可能的话,子类化会更安全。

于 2021-02-23T13:03:52.667 回答