gpt4 book ai didi

ios - 如何使用 IBInspectable 来控制 subview 的属性?

转载 作者:搜寻专家 更新时间:2023-11-01 06:56:07 24 4
gpt4 key购买 nike

我正在编写一个自定义 View ,它有两个标签作为 subview - titleLabelsubtitleLabel

我添加了两个名为 titleTextsubtitleText@IBInspectable 属性,这样我就可以在 Storyboard中非常轻松地设置标签的文本。

class MyView : UIView {
var titleLabel: UILabel!
var subtitleLabel: UILabel!

@IBInspectable
var titleText: String? {
get { return titleLabel.text }
set {
titleLabel.text = newValue
let fontSize = // calculates appropriate font size for the text...
titleLabel.font = font.withSize(fontSize)
}
}

@IBInspectable
var subtitleText: String? {
get { return subtitleLabel.text }
set {
subtitleLabel.text = newValue
let fontSize = // calculates appropriate font size for the text...
subtitleLabel.font = font.withSize(fontSize)
}
}

override func draw(_ rect: CGRect) {
// here I make the view look prettier, irrelevant to the question
}
}

现在我需要初始化这两个标签并将它们添加为 MyView 的 subview 。我想我可以在 awakeFromNib 中做到这一点:

override func awakeFromNib() {
titleLabel = UILabel(frame: CGRect(
x: ...,
y: ...,
width: ...,
height: ...))
self.addSubview(titleLabel)
subtitleLabel = UILabel(frame: CGRect(
x: ...,
y: ...,
width: ...,
height: ...))
self.addSubview(subtitleLabel)

}

所以我向 Storyboard添加了一个 MyView 并使用属性检查器设置它的属性,然后我运行了该应用程序。它崩溃了。

显然,IBInspectable 属性是在 awakeFromNib 之前设置的,因此那时标签还没有初始化。

这意味着我需要在设置 IBInspectable 属性之前调用的方法中初始化标签。

IBInspectable 属性设置之前调用的方法是什么,我可以重写以初始化 subview ?

最佳答案

这可能是显而易见的,但将这些东西放入的正确方法是初始化器

// called when initialized from code
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}

// called when initialized from storyboard/xib
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}

private func commonInit() {
// add subviews
}

此外,在您的具体情况下没有真正的理由选择:

let titleLabel: UILabel = UILabel()

您可以将标签添加为 subview 并稍后更新框架。

关于ios - 如何使用 IBInspectable 来控制 subview 的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53238118/

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