it-swarm.com.ru

Что такое ограничение UIView-Encapsulated-Layout-Width?

Я продолжаю получать исключения «Невозможно одновременно удовлетворить ограничения» (Xcode 5, iOS 7, как устройство, так и симулятор), где одно из ограничений в списке выглядит примерно так:

"<NSLayoutConstraint:0x165b23d0 'UIView-Encapsulated-Layout-Width'
H:[StoryPlayerCell:0x165affc0(0)]>"

Я не устанавливал это ограничение самостоятельно. Это также не NSAutoresizingMaskLayoutConstraint. Но откуда он взялся? И как от этого избавиться?

Я понятия не имею .. И я не могу найти ничего о 'UIView-Encapsulated-Layout-Width' в документации Apple .. Даже поиск Google ничего не возвращает вообще.

Какие-либо предложения?

PS: я использую эту ячейку в UICollectionView с пользовательским подклассом UICollectionViewFlowLayout. Может быть, часть 'Encapsulated-Layout' как-то связана с этим?

46
Goodsquirrel

Быстрое и приятное решение - назначить значение приоритета 999 пользовательским ограничениям с высоким приоритетом. Инкапсулированные и автоматически генерируемые ограничения должны доминировать с более высоким приоритетом, чем ваши ограничения.

https://stackoverflow.com/a/25795758/590010

16
DZenBot

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

CGFloat height = MAX(0, -y + maxY); строка 79 в CSStickyHeaderFlowLayout.m. 

если вы используете статическое значение для высоты, например 200, исключение больше не произойдет. Я не могу понять, что именно UIView-Encapsulated-Layout, но кажется, что динамическое изменение фрейма UICollectionViewLayoutAttributes может вызвать эту проблему. в примере проекта это высота, в проблеме ПО, я думаю, это ширина. Может быть, я смогу немного углубиться в это, если вы думаете, что это будет полезно

3
Xu Yin

Я обнаружил это в сборках iOS 10, где я использовал подклассы UITableViewCell как обычные представления, а не как строки таблицы. Ячейка ограничивала свой contentView нулевой шириной.

Обходной путь, который я использовал, состоял в том, чтобы просто добавить contentView к иерархии представления вместо ячейки представления таблицы. Я также удостоверился, что сохранил ячейку tableView (поскольку она больше не сохранялась самой иерархией представления).

1
Joseph Lord

Я могу пролить свет на ответ на вопрос. В моем приложении OS X я обнаружил такое загадочное ограничение для представления ячеек NSTableView (то есть объекта, который я ранее возвратил в методе NSTableViewDelegate -tableView: viewForTableColumn: row). Я также отправил сообщение setWidth: 0.0 в этот же столбец таблицы. Изменение параметра в этом setWidth: от 0.0 до чего-то еще отражалось в постоянном значении загадочного ограничения.

Заключение. Ограничения, которые регистрируются сами с помощью «UIView-Encapsulated-Layout-Width» или «NSView-Encapsulated-Layout-Width», вызваны установкой ширины столбца таблицы или чем-то подобным.

0
Jerry Krinock

Моя ситуация

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

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

Как я это исправил

От:

topTitleLeadingAnchorLandscape.isActive = true

Для того, чтобы:

DispatchQueue.main.async {
    self.topTitleLeadingAnchorLandscape.isActive = true
}

Надеюсь, это сэкономит кому-то много времени в будущем! ????

0
George_E