使用约束时不显示 UILabel 子类

Posted

技术标签:

【中文标题】使用约束时不显示 UILabel 子类【英文标题】:UILabel subclass not showing when using constraints 【发布时间】:2018-11-09 10:00:05 【问题描述】:

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

这里是我的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 
    

这里的实现:(在视图控制器内)

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 是白色的 背景为黑色,上面有图像。 我已尝试删除图像和除标签之外的所有内容,但没有任何改变。

【问题讨论】:

顺便说一句,我没有故事板。 您是否尝试过调试您的 UI 层次结构? 我该怎么做? 检查this。希望对您有所帮助。 【参考方案1】:

这是使用子类的一个不好的理由。它不允许你在适当的时候混搭。

最好是做一个扩展:

extension UILabel 
    func withHeaderStyle() -> UILabel 
        self.textColor = ThemeManager.currentTheme.palette.primary
        self.font = ThemeManager.currentTheme.textStyle.headerText
        return self
    

然后在使用点:

var titleLabel = UILabel().withHeaderStyle()

您可以创建多个“withXStyle”方法,并在使用时将它们链接在一起。这是继承无法做到的。


一般来说,你应该只在你想改变行为时使用继承。它不适合更改数据。

【讨论】:

【参考方案2】:

我已通过将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 时,它不会(如果你仔细想想,这很明显)任何东西。

我仍然认为有更好的解决方案,但这对我来说很好,所以我会保留它。

现在您可能会问:“为什么要覆盖 getter 而不是这样做?”

这是正确的问题,正确的答案是我在 medium 上的一篇 swift 文章中读到它,所以我认为它是正确的。

PS:我也尝试过使用didSet,但它显然会自行循环并崩溃。

【讨论】:

以上是关于使用约束时不显示 UILabel 子类的主要内容,如果未能解决你的问题,请参考以下文章

对子类 UIView 的约束会抛出以编程方式创建的 UILabel 位置

使 UILabel 约束显示全宽

故事板中的 UILabel 子类外观

UIImageView 不显示

具有自动布局约束的 UITableViewCell 子类大小不正确

iOS - 带约束的多行 UILabel 高度