使用约束时不显示UILabel子类

时间:2018-11-09 10:00:05

标签: ios swift autolayout uilabel constraints

我创建了一个子类来管理主题,但未在设备或模拟器上均未显示。

这是我的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是白色的
  • 背景为黑色,上面有图像。
  • 我试图删除图像和周围的所有东西,除了标签,什么都没有改变。

2 个答案:

答案 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,但显然它会自我循环并崩溃。