创建可重用的UIView子类-遇到大小调整问题

问题描述 投票:0回答:1

我正在尝试为底部的“标签”创建一个小的可重用视图(“ PC-12受限”和“ PC-24受限”)。

enter image description here

这是我所拥有的代码,并且大部分都在运行。

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内时,它会移到stackview的外面吗?另外,我添加了其中两个TagView,但是它们彼此重叠显示!

enter image description here

当我在Xcode中使用视图调试器时,我得到一些带有以下信息的感叹号:

enter image description here

enter image description here

为什么职位模棱两可?我想念什么?当我打印要添加到视图层次结构的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>>]

编辑:

如果我在UITableViewCell .xib文件中的UIStackView中添加两个TagView,则可以正常工作:

enter image description here

但是当我以编程方式实例化并添加它们时,我遇到了如上所述的布局问题。


编辑2:

我有一个非常小的测试项目,所以您可以重现该问题:https://github.com/kevinrenskers/TagViewTest

ios uiview
1个回答
0
投票

最后找到了问题。而且我觉得很蠢🤦‍♂️

tagsStackView.addSubview(tagView)

当然应该是

tagsStackView.addArrangedSubview(tagView)
© www.soinside.com 2019 - 2024. All rights reserved.