Подтвердить что ты не робот

Странная ошибка UIView-Encapsulated-Layout-Height

Я делаю тестовое приложение, поэтому в моем tableviewCell в раскадровке у меня есть imageView и webView (для отображения html-текста). Я установил ограничения, такие как top/left/right/height = 200 для imageView, spacing = 5 между ними и left/right/bot для webView, поэтому я хочу программно вычислить высоту webView, а затем изменить привязку ячейки, чтобы растянуть мой webView. Но я получил это:

Невозможно одновременно удовлетворить ограничениям.

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

Попробуйте следующее:

(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 & fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property

translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fd6f3773f90 V:[UIImageView:0x7fd6f3773e90(200)]>",
    "<NSLayoutConstraint:0x7fd6f3774280 UIImageView:0x7fd6f3773e90.top == UITableViewCellContentView:0x7fd6f3462710.topMargin>",
    "<NSLayoutConstraint:0x7fd6f3774320 V:[UIImageView:0x7fd6f3773e90]-(5)-[UIWebView:0x7fd6f3462800]>",
    "<NSLayoutConstraint:0x7fd6f3774370 UITableViewCellContentView:0x7fd6f3462710.bottomMargin == UIWebView:0x7fd6f3462800.bottom>",
    "<NSLayoutConstraint:0x7fd6f375ee40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fd6f3462710(205)]>"
)

Любые предложения?

4b9b3361

Ответ 1

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

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fd7c2ecb520 V:[UIView:0x7fd7c2ecd0e0(300)]>

Идем дальше и опускаем этот приоритет на 999.

Это должно сработать.

Приветствия.

Ответ 2

если вы используете tableView.rowHeight = UITableViewAutomaticDimension, вы всегда должны установить estimatedRowHeight. Например:

tableView.estimatedRowHeight = 44

или вы должны реализовать:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

в противном случае вы всегда получите предупреждение UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView, и содержимое будет свернуто неверно.

Ответ 3

Эта ошибка произошла со мной, когда UIButton попытался автоматически отрегулировать ее высоту, создав UIView-Encapsulated-Layout-Height, который конфликтует с моими верхними и нижними ограничениями.

Я исправил его, явно добавив ограничение высоты.

Ответ 4

Для меня я использую расчетную высоту для ячеек, и для решения этой проблемы я устанавливаю приоритет ограничения с нижней части ярлыка до его соседа до 999, и он работал.

Ответ 5

Извините, что я опаздываю на игру.:)

Уменьшение приоритета ограничения, которое Autolayout пытается сломать, может быть не решением, если требуется ограничение в первую очередь.

У меня была эта проблема на днях, вот как выглядел мой макет:

  • OuterView < - C1: ограничение ширины, равное ему супервизор
    • StackView < - C2: ограничение ширины, равное OuterView
      • ChildView < - C3: ограничение фиксированной ширины, константа = StackView.frame.size.width

Проблема произошла, когда я уменьшал ширину C1, поэтому, очевидно, потому, что C3 был на фиксированной ширине, которая занимала исходный размер кадра, уменьшая C1 вызванные конфликты и C1 был нарушен iOS, чтобы исправить проблему.

Проблема была быстро устранена установкой C3 для выбора ширины стека ViewAnchor вместо размера фрейма.

Неправильное ограничение

view.widthAnchor.constraint(equalToConstant: stackView.frame.size.width).isActive = true

Правильное ограничение

view.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1.0).isActive = true

Таким образом, всякий раз, когда C1 изменяется, все дочерние ограничения будут реагировать на него соответствующим образом.

Вывод:

  • Я не думаю, что эта ошибка была ошибкой, о которой говорили некоторые.
  • Разрешение, регулируя приоритет, работает, но это то, что вы хотели получить?
  • Если вы решили разрешить его без приоритета, посмотрите на свои ограничения, особенно программные, чтобы проверить наличие конфликтов. Если вы имеете дело с динамической шириной или высотой для ваших представлений, таких как представления ячеек, убедитесь, что ограничение высоты или ширины родительского представления не противоречит этим динамическим изменениям и просто продолжает работать вверх.

Ответ 6

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

Интересно, что исправление для этого было переопределить - tableView:heightForRowAtIndexPath: и tableView:estimatedHeightForRowAtIndexPath: и вернуть мою предполагаемую высоту строки и UITableViewCellAutomaticDimension вместо установки rowHeight и estimatedRowHeight в мой tableView в viewDidLoad:.