我怎样才能混合 UIView.init

How can I swizzle UIView.init

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

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

我以前从未尝试过 swizzling,但很想试试这个 - 快速 google 发现 this article 解释了如何使用 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
    }

}

那么您只需要确保 运行 在您的 AppDelegate didFinishLaunchingWithOptions 方法中或在您的应用程序开始的某个地方

UIView.classInit

上面的代码在 iOS 13.7 模拟器上对我有用,据我所知 你真的不应该尝试重写这样的方法 尤其是这样一个核心对象,如果可能的话,继承UIView会更安全。