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

Что такое ограничение 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' имеет какое-то отношение к этому?

4b9b3361

Ответ 1

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

fooobar.com/questions/35030/...

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Моя ситуация

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

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

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

От:

topTitleLeadingAnchorLandscape.isActive = true

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

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

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