我正在尝试构建自定义样式的组件,这些组件可以处理从上面传播的自定义特征并相应地调整其样式。例如:
class CustomButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
self.registerForTraitChanges([DangerStyleTrait.self]) { (self: Self, _) in
// Do some styling changes if danger is true or not
}
}
}
我想在其他组件中使用这些组件:
class InfoViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = CustomButton()
view.addSubview(button)
// <Button layout elided>
}
}
在我通常的场景中,自定义特征将在演示之前应用:
func showWarningAlert() {
let viewController = InfoViewController
viewController.traitOverrides.dangerStyleEnabled = true
present(viewController, animated: true)
}
但是上面的方法不行!该按钮永远不会收到特征更改更新,因此永远不会应用危险样式。我假设一旦视图控制器的视图添加到层次结构中,更新就会发送到按钮。
如果这是预期行为,是否有针对上述情况的解决方法?我希望这是一个合理的用例,希望设置一个完整的视图控制器,然后应用一个特征并让它在演示文稿中一路传播。
谢谢!
这并非特定于自定义特征。
特质没有改变。它从一开始就在那里。除了检查更改之外,您的
CustomButton
实现还应该从一开始就检查其特征集合。
无论您的
CustomButton
类中有什么设置代码,都需要从一开始就考虑影响其外观的任何特征。
注册特定特征更改是为了允许视图在特征更改后自行更新。