gpt4 book ai didi

ios - 执行 `layoutSubviews` 绘图_without_子类化 View ,而不是使用闭包?

转载 作者:行者123 更新时间:2023-11-28 08:07:53 24 4
gpt4 key购买 nike

我的场景阻止我进行子类化

class Button: UIButton {
override open func layoutSubviews() { // I cannot do this
super.layoutSubviews()
layer.cornerRadius = bounds.height / 2
}
}

我的场景阻止我使用常量和这个场景我不能覆盖 MyView 中的 layoutSubviews,这只是为了给示例提供上下文。

class MyView: UIView {

let buttonHeight: CGFloat = 50
lazy var button: UIButton = ...

func setupSubViews() { // I cannot do this either..
button.addConstraint(button.heightAnchor.constraint(equalToConstant: buttonHeight))
button.layer.cornerRadius = buttonHeight / 2
}
}

我想要什么(不可能?😬)。而且我不能覆盖MyView 中的layoutSubviews,它只是给示例一个上下文。

class MyView: UIView {

lazy var button: UIButton = ...

func setupSubViews() {
// desired solution, using some closure that will be run when layouting
button.whenLayout { button, boundsWhenLayout in
button.layer.cornerRadius = boundsWhenLayout.height / 2
}
}
}

是否有可能做我想做的事?我再说一遍,我不能子类化也不能使用常量作为高度。我不能在拥有 UIButton 的 View / View Controller 中使用 layoutSubview。我想要一个通用的解决方案

也许以某种方式使用 Objective-C method swizzling?或者也许使用一些转换

最佳答案

这个怎么样:

private let swizzling: (AnyClass, Selector, Selector) -> () = { forClass, originalSelector, swizzledSelector in
let originalMethod = class_getInstanceMethod(forClass, originalSelector)
let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)
method_exchangeImplementations(originalMethod, swizzledMethod)
}

extension UIButton {
public func startSwizzle() {
let originalSelector = #selector(layoutSubviews)
let swizzledSelector = #selector(swizzled_layoutSubviews)
swizzling(UIButton.self, originalSelector, swizzledSelector)
}

func swizzled_layoutSubviews() {
swizzled_layoutSubviews()
print("swizzled_layoutSubviews ", self.frame)
}

}

这是对 UIButton 的扩展,它添加了一个 startSwizzle 方法,调用该方法时会在实际类版本之前执行 swizzled_layoutSubviews()。

关于ios - 执行 `layoutSubviews` 绘图_without_子类化 View ,而不是使用闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44564087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com