Swift - Программно сделанные ограничения заставляют изображение растягиваться - PullRequest
0 голосов
/ 15 мая 2019

У меня есть UIImageView, и я программно добавил к нему ограничения. Позиция правильная, но она растягивает мое изображение, как вы можете видеть на скриншотах ... вот мои ограничения:

 let arrow = UIImageView()

 contentView.addSubview(arrow)
    arrow.translatesAutoresizingMaskIntoConstraints = false
    arrow.widthAnchor.constraint(equalToConstant: 25).isActive = true
    arrow.heightAnchor.constraint(equalToConstant: 25).isActive = true
    arrow.trailingAnchor.constraint(equalTo: marginGuide.trailingAnchor).isActive = true
    arrow.topAnchor.constraint(equalTo: marginGuide.topAnchor).isActive = true
    arrow.bottomAnchor.constraint(equalTo: marginGuide.bottomAnchor).isActive = true

Мой вопрос: что я здесь не так делаю?

enter image description here

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Не всегда необходимо указывать все ограничения (например, передний, задний, верхний, нижний, высота, ширина и т. Д.), Чтобы определить его размер относительно суперпредставления.

Представление просто необходимообязательные ограничения для установки его координат в суперпредставлении.

Как сказал rmaddy, не давайте чрезмерных ограничений представлению.

Вам просто нужны следующие константы (просто удалите все остальные ограничения)

arrow.widthAnchor.constraint(equalToConstant: 25).isActive = true
arrow.heightAnchor.constraint(equalToConstant: 25).isActive = true

contentView.centerYAnchor.constraint(equalTo: arrow.centerYAnchor).isActive = true
arrow.trailingAnchor.constraint(equalTo: marginGuide.trailingAnchor).isActive = true
0 голосов
/ 15 мая 2019

Вы должны добавить центральное ограничение по вертикали и удалить верхний и нижний якоря, если вы не нуждаетесь

   let arrow = UIImageView()
    contentView.addSubview(arrow)
    arrow.translatesAutoresizingMaskIntoConstraints = false
    arrow.widthAnchor.constraint(equalToConstant: 25).isActive = true
    arrow.heightAnchor.constraint(equalToConstant: 25).isActive = true
    arrow.trailingAnchor.constraint(equalTo: marginGuide.trailingAnchor).isActive = true

let yConstraint = NSLayoutConstraint(item: arrow, attribute: .centerY, relatedBy: .equal, toItem: contentView, attribute: .centerY, multiplier: 1, constant: 0)
NSLayoutConstraint.activate([yConstraint])    //Or contentView.centerYAnchor.constraint(equalTo: arrow.centerYAnchor).isActive = true

или если ваш показатель для ячейки фиксирован

 arrow.topAnchor.constraint(equalTo: marginGuide.topAnchor, constant: 25).isActive = true // 25 or space your design need
 arrow.bottomAnchor.constraint(equalTo: marginGuide.bottomAnchor, constant: 25).isActive = true //25 or space your design need need
0 голосов
/ 15 мая 2019

Этот нижний якорь вызывает растяжение изображения. У вас есть несколько вариантов:

  1. Сохраните верхнее ограничение и удалите нижнее ограничение.
  2. Центрируйте изображение в вертикальном положении. без ограничения сверху и снизу, конечно.
  3. Ваш код на самом деле правильный, если вы хотите, чтобы imageView определял высоту вашей ячейки (если вы используете автоматическую высоту). Но, видимо, этикетка это определяет.

Обычно при использовании автоматической высоты ячейки представления, которые следует подключать сверху вниз, представляют собой метки или последний вид снизу ячейки.

...