iOS | Ошибка ограничения макета при программном добавлении двух представлений - PullRequest
0 голосов
/ 03 апреля 2020

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

Вот ошибка

[LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x6000003d0190 V:|-(0)-[UIImageView:0x7faa7401b940]   (active, names: '|':Movies_TODO.MovieViewCell:0x7faa7402caa0'custom' )>",
    "<NSLayoutConstraint:0x6000003d05a0 UIImageView:0x7faa7401b940.bottom == Movies_TODO.MovieViewCell:0x7faa7402caa0'custom'.bottom   (active)>",
    "<NSLayoutConstraint:0x6000003d0640 UIImageView:0x7faa7401b940.height == 100   (active)>",
    "<NSLayoutConstraint:0x6000003e7070 'UIView-Encapsulated-Layout-Height' Movies_TODO.MovieViewCell:0x7faa7402caa0'custom'.height == 100.5   (active)>"
)

Попытка восстановления путем нарушения ограничения

Вот мой кусок моего кода

self.addSubview(movieImageView)
self.addSubview(titleLabel)

movieImageView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
movieImageView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
movieImageView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
movieImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true

movieImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true

titleLabel.leadingAnchor.constraint(equalTo: movieImageView.trailingAnchor, constant: 20).isActive = true
titleLabel.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
titleLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
titleLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Вы установили нижнюю привязку и верхнюю привязку вашего movieImageView, которые косвенно говорят высоту вашего movieImageView.

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

Чтобы избежать этого предупреждения, удалите

movieImageView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

Это предупреждение из-за избыточных ограничений для одного и того же свойства.

Попробуйте следующие ограничения

    movieImageView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
    movieImageView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
    movieImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true
    movieImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true

    titleLabel.leadingAnchor.constraint(equalTo: movieImageView.trailingAnchor, constant: 20).isActive = true
    titleLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
    titleLabel.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: self.movieImageView.bottomAnchor).isActive = true

Результат это ограничение

Result of the constraints

2 голосов
/ 03 апреля 2020

Ваш movieImageView имеет ограничение, подобное height equal to 100 AND height equal to super view's height (это произошло после того, как вы добавили ограничения верхнего и нижнего якоря).


1 - Если вы хотите установить movieImageView сверху вниз, просто удалите movieImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true.


2 - Если вы хотите установить movieImageView Высота постоянно 100, просто удалите строку, которую вы не хотите устанавливать для movieImageView ->

// if you want to stick your imageView to bottom delete this
movieImageView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true

// if you want to stick your imageView to top delete this
movieImageView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

С UIStackView

  • Если вы хотите создать TableViewCell левостороннее изображение и правостороннюю метку, вы можете использовать StackView, и вы можете делать то, что хотите, без каких-либо ограничений.

Создать a UIStackView

let stackView = UIStackView()

Добавьте свои movieImageView и titleLabel

stackView.addArrangedSubviews(movieImageView, titleLabel)
stackView.axis = .horizontal
stackView.spacing = 20.0

Добавьте stackView к super.view

self.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false

stackView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

stackView. trailingAnchor.constraint(equalTo: self. trailingAnchor).isActive = true
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true

Если вы хотите установить ширину movieImageView из его изображения, вы должны установить Content Hugging Priority из movieImageView

movieImageView.setContentHuggingPriority(.defaultHigh, for: .horizontal)

Если вы хотите установить ширину titleLabel из его текста и стойче, чем imageView, вы должны установить Compression Resistance Priority из titleLabel

titleLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)

БОНУС

Intrinsi c Размер содержимого

UIStackView Guid e

UIStackView Пример Hackingwithswift

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