我怎样才能混合 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
会更安全。
我正在尝试调整 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
会更安全。