Как я могу swizzle UIView.init

Я пытаюсь изменить методы инициализации UIView и все, что его подклассифицирует. Пока мои попытки приводят только к сбоям или просто не делают ничего заметного.

Результатом попытки достичь является возможность переопределить значение цвета и ширины границы представлений в попытке визуализировать кадры представления без необходимости подключения отладчика.

1 ответ

Раньше я никогда не пробовал пить, но мне захотелось попробовать - быстрый 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
    }

}

Тогда вам просто нужно убедиться, что вы запустили swizzle в своем AppDelegate. didFinishLaunchingWithOptions метод или где-нибудь в начале вашего приложения

      UIView.classInit

Приведенный выше код работает для меня на симуляторе iOS 13.7, хотя из того, что я прочитал, вам действительно не следует пытаться переопределить такие методы, особенно из такого основного объекта, было бы безопаснее создать подкласс UIView если возможно.

Другие вопросы по тегам