创建可重用的 UIView 子类 - 运行 大小问题
Creating a reusable UIView subclass - running into sizing issues
我正在尝试为底部的 "tags"("PC-12 Restricted" 和 "PC-24 Restricted")创建一个可重复使用的小视图。
这是我的代码,大部分都有效。
class TagView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
private let label = UILabel()
func setup() {
translatesAutoresizingMaskIntoConstraints = false
label.text = "Placeholder"
label.translatesAutoresizingMaskIntoConstraints = false
label.font = .preferredFont(forTextStyle: .caption2)
addSubview(label)
NSLayoutConstraint.activate([
label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
label.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8),
label.topAnchor.constraint(equalTo: topAnchor, constant: 4),
label.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -4),
])
}
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = bounds.height / 2
}
func configure(tag: Tag) {
label.text = tag.label
backgroundColor = tag.backgroundColor
}
}
但是,当我将它放在 UITableViewCell 内的 UIStackView 内时,它会移出堆栈视图吗?另外,我添加了两个这样的 TagView,但它们显示在彼此之上!
当我在 Xcode 中使用视图调试器时,我得到了一些带有以下信息的感叹号:
为什么位置不明确?我错过了什么?当我打印要添加到我的视图层次结构中的 TagView 时,我确实看到它们有一个框架,所有内容都设置为 0,但是当我查看视图调试器时,它们确实有一个框架。
let tagViews = airport.tags.map { tag -> TagView in
let tagView = TagView()
tagView.configure(tag: tag)
return tagView
}
print(tagViews)
for view in tagViews {
tagsStackView.addSubview(view)
}
[<MyApp.TagView: 0x7f81ac449570; frame = (0 0; 0 0); layer = <CALayer: 0x600001afaba0>>, <MyApp.TagView: 0x7f81ac449c70; frame = (0 0; 0 0); layer = <CALayer: 0x600001afae60>>]
编辑:
如果我将两个 TagView 添加到 UITableViewCell .xib 文件中的 UIStackView,它工作正常:
但是当我以编程方式实例化和添加它们时,我遇到了所描述的布局问题。
编辑 2:
我有一个非常小的测试项目,因此您可以重现问题:https://github.com/kevinrenskers/TagViewTest
终于找到问题了。我觉得自己很蠢 ♂️
tagsStackView.addSubview(tagView)
当然应该
tagsStackView.addArrangedSubview(tagView)
我正在尝试为底部的 "tags"("PC-12 Restricted" 和 "PC-24 Restricted")创建一个可重复使用的小视图。
这是我的代码,大部分都有效。
class TagView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
private let label = UILabel()
func setup() {
translatesAutoresizingMaskIntoConstraints = false
label.text = "Placeholder"
label.translatesAutoresizingMaskIntoConstraints = false
label.font = .preferredFont(forTextStyle: .caption2)
addSubview(label)
NSLayoutConstraint.activate([
label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8),
label.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8),
label.topAnchor.constraint(equalTo: topAnchor, constant: 4),
label.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -4),
])
}
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = bounds.height / 2
}
func configure(tag: Tag) {
label.text = tag.label
backgroundColor = tag.backgroundColor
}
}
但是,当我将它放在 UITableViewCell 内的 UIStackView 内时,它会移出堆栈视图吗?另外,我添加了两个这样的 TagView,但它们显示在彼此之上!
当我在 Xcode 中使用视图调试器时,我得到了一些带有以下信息的感叹号:
为什么位置不明确?我错过了什么?当我打印要添加到我的视图层次结构中的 TagView 时,我确实看到它们有一个框架,所有内容都设置为 0,但是当我查看视图调试器时,它们确实有一个框架。
let tagViews = airport.tags.map { tag -> TagView in
let tagView = TagView()
tagView.configure(tag: tag)
return tagView
}
print(tagViews)
for view in tagViews {
tagsStackView.addSubview(view)
}
[<MyApp.TagView: 0x7f81ac449570; frame = (0 0; 0 0); layer = <CALayer: 0x600001afaba0>>, <MyApp.TagView: 0x7f81ac449c70; frame = (0 0; 0 0); layer = <CALayer: 0x600001afae60>>]
编辑:
如果我将两个 TagView 添加到 UITableViewCell .xib 文件中的 UIStackView,它工作正常:
但是当我以编程方式实例化和添加它们时,我遇到了所描述的布局问题。
编辑 2:
我有一个非常小的测试项目,因此您可以重现问题:https://github.com/kevinrenskers/TagViewTest
终于找到问题了。我觉得自己很蠢 ♂️
tagsStackView.addSubview(tagView)
当然应该
tagsStackView.addArrangedSubview(tagView)