Ios 如何使用UIView.init

Ios 如何使用UIView.init,ios,objective-c,swift,swizzling,swizzle,Ios,Objective C,Swift,Swizzling,Swizzle,我正在尝试swizzle UIView的init方法以及任何将其子类化的方法。到目前为止,我的尝试只会导致崩溃,或者根本没有任何明显的效果 尝试实现的结果是能够覆盖视图边框颜色和宽度的值,以尝试在不需要附加调试程序的情况下可视化视图框架。我以前从未尝试过滑动,但很想尝试一下——谷歌很快发现了一个解释如何使用扩展名来实现这一点的方法 extension UIView { static let classInit: Void = { guard let origin

我正在尝试swizzle UIView的init方法以及任何将其子类化的方法。到目前为止,我的尝试只会导致崩溃,或者根本没有任何明显的效果


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

我以前从未尝试过滑动,但很想尝试一下——谷歌很快发现了一个解释如何使用扩展名
来实现这一点的方法

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
方法中运行swizzle,或者在应用程序的开始处运行swizzle

UIView.classInit


上述代码适用于我在iOS 13.7模拟器上的工作,但从我所读到的来看,你真的不应该试图覆盖这样的方法,尤其是从这样一个核心对象,如果可能的话,将
UIView
子类化会更安全。

您需要将您的问题以a的形式包含所有相关的代码,以便在主题上提出问题。我倾向于同意swizzling不是一种很好的方法,因为它在运行时不确定,但是该功能将只在非生产版本中运行。我认为您可能已经了解了一些东西,尽管只尝试swizzle LayoutSubview而不是init。这让生活变得容易多了。一旦我站在电脑前,我会给它一次机会,并将其标记为批准。干杯,伙计。我可以确认这个实现是有效的。在我这边,我需要整理一些关于在每个视图上恢复以前的边界状态的事情,但这让我走出了困境,回到了起点。为了回答问题,这是100%正确的。