Создание многократно используемого подкласса UIView - проблемы с размерами - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать небольшое многоразовое представление для «тегов» внизу («P C -12 Restricted» и «P C -24 Restricted»).

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
  }
}

Однако, когда я помещаю его в UIStackView внутри UITableViewCell, он перемещается вне стека? Кроме того, я добавил два из этих TagViews, но они отображаются друг на друге!

enter image description here

Когда я использую отладчик представления в Xcode, я получить несколько восклицательных знаков со следующей информацией:

enter image description here

enter image description here

Почему позиция неоднозначна ? Что мне не хватает? Когда я печатаю TagViews, которые я добавляю в мою иерархию представлений, я вижу, что у них есть фрейм со всем, установленным в 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>>]

Редактировать:

Если я добавлю два TagViews в мой UIStackView внутри моего UITableViewCell .xib файла, он будет отлично работать:

enter image description here

Но когда я создаю и добавляю их программно, у меня возникают проблемы с макетом, как описано.


Редактировать 2:

У меня очень маленький тестовый проект чтобы вы могли воспроизвести проблему: https://github.com/kevinrenskers/TagViewTest

1 Ответ

0 голосов
/ 04 апреля 2020

Наконец-то нашел проблему. И я чувствую себя глупо 100

tagsStackView.addSubview(tagView)

должно быть, конечно,

tagsStackView.addArrangedSubview(tagView)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...