Виды неуместны при установке кадров - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь сделать вид программно, создаю карточку с изображением и текстом и накладываю на нее какой-то цвет. Я отключил клип в границах и добавил несколько цветов, чтобы сделать его более наглядным. Поэтому, когда я устанавливаю

overlay.frame = self.frame

или

overlay.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)

, наложение должно охватывать весь вид, но это не так, почему это так?

Это что показывает

Это то, что я хочу видеть, но с каждой картой, имеющей синий слой сверху

private var leftImage: UIImageView = {
  let i = UIImageView(frame: .zero)
  i.contentMode = .scaleAspectFill
  i.image = UIImage()
  return i
}()

private var topLabel: UILabel = {
  let label = UILabel(frame: .zero)
  label.isUserInteractionEnabled = false
  label.font = UIFont.boldSystemFont(ofSize: 16.0)
  label.lineBreakMode = .byWordWrapping
  label.adjustsFontSizeToFitWidth = true
  label.numberOfLines = 2
  return label
}()

var bottomLabel: UILabel = {
  let label = UILabel(frame: .zero)
  label.isUserInteractionEnabled = false
  label.lineBreakMode = .byWordWrapping
  label.font = UIFont.systemFont(ofSize: 12.0)
  label.numberOfLines = 1
  label.text = "60 seconds"
 return label
}()

private var stackView: UIStackView = {
  let stack = UIStackView(frame: .zero)
  stack.axis = .vertical
  stack.isUserInteractionEnabled = false
  stack.distribution = .fillEqually
  stack.layoutMargins = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
  stack.isLayoutMarginsRelativeArrangement = true
  return stack
}()

private var overlay: UIView = {
  let view = UIView(frame: .zero)
  view.backgroundColor = .blue
  view.alpha = 0.8
  //view.isHidden = true
  return view
}()



override init(frame: CGRect) {
  super.init(frame: frame)
  create()
}

required init?(coder: NSCoder) {
  super.init(coder: coder)
  create()
}




private func create() {
  self.translatesAutoresizingMaskIntoConstraints = false

  //leftview
  leftImage.frame = CGRect(x: 0, y: 0, width: frame.width / 2, height: frame.height)
  addSubview(leftImage)

  //rightVIew
  stackView.frame = CGRect(x: frame.midX, y: 0, width: frame.width / 2, height: frame.height)

  clipsToBounds = false



  //add views to stack
  stackView.addArrangedSubview(topLabel)
  stackView.addArrangedSubview(bottomLabel)


  addSubview(stackView)

  overlay.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)
  addSubview(overlay)

  //card styling
  layer.cornerRadius = 10
}

Ответы [ 2 ]

1 голос
/ 19 февраля 2020
overlay.frame = self.frame

Это никогда не может быть правильным, кроме как случайно, потому что frame из overlay и frame из self находятся в двух разных системах координат. По крайней мере, вы хотите сказать

overlay.frame = self.bounds // bounds, not frame

Однако это тоже не сработает, если вы не скажете это в нужном месте. Правильное место, когда происходит макет:

override func layoutSubviews() {
    super.layoutSubviews()
    self.overlay.frame = self.bounds
}

Простое добавление этого в существующий код должно решить проблему.

0 голосов
/ 19 февраля 2020

Проблема в том, что вы устанавливаете размеры вашего наложения следующим образом:

overlay.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height)

до того, как суперпредставление определит его окончательную ширину и высоту. Вам нужно будет выполнить одно из следующих действий:

  1. Позвонить create() после того, как класс суперпредставления определит свой окончательный размер
  2. Непрерывно устанавливать рамку наложения как ширину и высоту суперпредставления. изменения (см. https://developer.apple.com/documentation/uikit/uiview/1622482-layoutsubviews)
  3. Использование ограничений AutoLayout через файл раскадровки / раскадровки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...