我创建了一个子类来管理主题,但未在设备或模拟器上均未显示。
这是我的Header.swift
:
import Foundation
import UIKit
class Header: UILabel {
override var textColor: UIColor! {
// White Color
get { return ThemeManager.currentTheme.palette.primary }
set {}
}
override var font: UIFont! {
get { return ThemeManager.currentTheme.textStyle.headerText }
set {}
}
}
在这里实现:(在viewcontroller内部)
var titleLabel: Header = Header()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .black
// Background Image over the view
setupBackground()
setupStartButton()
setupTitleLabel()
print(titleLabel.frame)
}
// MARK: - Header
private func setupTitleLabel() {
titleLabel.text = "0.0m"
// titleLabel.font = ThemeManager.currentTheme.textStyle.headerText
// titleLabel.textColor = ThemeManager.currentTheme.palette.primary
view.addSubview(titleLabel)
view.bringSubviewToFront(titleLabel)
setupTitleLabelAutolayout()
}
private func setupTitleLabelAutolayout() {
titleLabel.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
titleLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
但是,如果我使用UILabel
而不是Header
,它会按预期运行。
我也尝试实现init?(coder aDecoder: NSCoder)
和init(frame: CGRect)
,但没有任何改变。
如果我在init上设置了frame
,则会显示文本,但不设置样式并忽略我的约束。
我当然想念什么,但是呢?
为避免有用的答案,请参见以下信息:
UILabel
的textColor是白色的答案 0 :(得分:2)
那是使用子类的一个不好的理由。不允许您在适当的时候混搭。
最好是进行扩展:
extension UILabel {
func withHeaderStyle() -> UILabel {
self.textColor = ThemeManager.currentTheme.palette.primary
self.font = ThemeManager.currentTheme.textStyle.headerText
return self
}
}
然后在使用点:
var titleLabel = UILabel().withHeaderStyle()
您可以使用多种“ withXStyle”方法,并且在使用时可以将它们链接在一起。那是继承不能做到的。
通常,仅当您要更改行为时,才应使用内在性。不适合更改数据。
答案 1 :(得分:1)
我通过将Header
编辑为此问题来解决该问题:
import Foundation
import UIKit
class Header: UILabel {
override init(frame: CGRect) {
super.init(frame: frame)
setupStyle()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupStyle()
}
private func setupStyle() {
self.textColor = ThemeManager.currentTheme.palette.primary
self.font = ThemeManager.currentTheme.textStyle.headerText
}
}
基本上,如果我理解正确,那么当我在标签中设置getter
时,它什么都不会(如果您考虑的话,这很明显)。
我仍然认为有更好的解决方案,但这对我来说很好,所以,我会保留。
现在您可能会问:“为什么您改写了吸气剂而不是这样做?”
这是正确的问题,正确的答案是我在一篇有关媒介的快速文章中阅读了它,所以我坚信这是正确的。
PS:我也尝试过使用didSet
,但显然它会自我循环并崩溃。