Странная ошибка 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)]>"
)
Любые предложения?
Ответы
Ответ 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:
.