gpt4 book ai didi

swift - UIAppearance 覆盖 UILabel 上的自定义 textColor

转载 作者:行者123 更新时间:2023-11-28 11:41:22 25 4
gpt4 key购买 nike

我使用以下方法在我的应用委托(delegate)中设置 UILabel 外观:

UILabel.appearance().textColor = UIColor.white

我还有一个自定义的 UIView 子类,它包含一个 UILabel 以及一些其他元素(此处省略):

@IBDesignable
class CustomView: UIView {
private let descriptionLabel = HCLabel()

override init(frame: CGRect) {
super.init(frame: frame)
setup()
}

required init?(coder: NSCoder) {
super.init(coder: coder)
}

override func awakeFromNib() {
super.awakeFromNib()
self.setup()
}

private func setup() {
self.descriptionLabel.textColor = UIColor.black

// ... other things not related to descriptionLabel
}
}

如果我在 Storyboard中实例化 CustomView,一切正常。但是,如果我在代码中实例化它,则 descriptionLabel 是白色(外观颜色),而不是黑色(我设置的颜色)。这里发生了什么?我的理解是,如果我设置自定义颜色,外观颜色将不会被使用。

最佳答案

您遇到的只是 UIAppearance 代理将其设置应用于新 UIView 的确切时间问题。我们什么时候可以假设它会这样做?它不可能在 init 之前执行此操作,因为 init 是 UIView 生命周期中发生的第一件事。因此,事件的顺序是这样的:

override init(frame: CGRect) {
super.init(frame: frame)
setup() // black
}
// and some time later, UIAppearance proxy comes along and sets it to white

因此,您的目标是在标签生命周期的早期调用setup——当然是在用户有机会看到它之前——但不要那么 UIAppearance 代理 稍后 起作用。让我们将对 setup 的调用移至标签生命周期的稍后时间:

// some time earlier, UIAppearance proxy sets it to white
override func didMoveToSuperview() {
setup() // black
}

现在我们外观代理有机会采取行动之后采取行动,因此您的设置是最后操作的,他们赢得了胜利。

我们仍然不知道如何我们可以尽早将调用移至设置并且仍然遵守外观代理设置之后.如果你有时间,你可能想尝试一下。例如,willMoveToSuperview 较早;如果你在那里调用 setup(而不是在 didMoveToSuperview 中),那行得通吗?玩一玩,找出答案!

关于swift - UIAppearance 覆盖 UILabel 上的自定义 textColor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53562500/

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