Как я могу 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
если возможно.