我正在尝试调整 UIView 的 init 方法以及任何子类化它的方法。到目前为止,我的尝试只会导致崩溃或根本没有做任何明显的事情。
尝试实现的结果是能够覆盖视图边框颜色和宽度的值,以尝试在不需要附加调试器的情况下可视化视图框架。
我正在尝试调整 UIView 的 init 方法以及任何子类化它的方法。到目前为止,我的尝试只会导致崩溃或根本没有做任何明显的事情。
尝试实现的结果是能够覆盖视图边框颜色和宽度的值,以尝试在不需要附加调试器的情况下可视化视图框架。
我以前从未尝试过 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
尤其是从这样的核心对象中,如果可能的话,子类化会更安全。