使用约束时不显示 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 位置