Что такое ограничение 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'
имеет какое-то отношение к этому?
Ответы
Ответ 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
}
Надеюсь, это сэкономит кому-то много времени в будущем! 😀