45

я получаю «Невозможно одновременно удовлетворяют ограничениям» исключения (Xcode 5, IOS 7, как устройство и имитатор), где один из ограничений в списке что-то вроде этого:Что такое ограничение UIView-Encapsulated-Layout-Width?

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

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

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

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

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

+0

Можете ли вы загрузить образец проекта, где это воспроизводится? –

+0

Попробуйте образец [CSStickyHeaderFlowLayout] (https://github.com/jamztang/CSStickyHeaderFlowLayout). Если вы обычно прокручиваетесь, ничего не происходит, но если вы прокручиваете очень медленно, ошибка будет сброшена. Это беспорядочно и трудно воспроизвести. – andreamazz

+1

@andreamazz Я играл с образцом, я думаю, что эти коды вызывают исключение Autolayout. 'CGFloat height = MAX (0, -y + maxY);' строка 79 в CSStickyHeaderFlowLayout.m. если вы используете статическое значение для высоты, например, 200, исключение больше не произойдет. Я не могу понять, что такое UIView-Encapsulated-Layout, но похоже, что динамическое изменение кадра UICollectionViewLayoutAttributes может вызвать эту проблему. в примере проекта, это высота, в проблеме PO, я думаю, что это ширина. Может быть, я смогу немного поработать, если вы считаете, что это будет полезно. –

ответ

3

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

CGFloat height = MAX(0, -y + maxY); линия 79 в CSStickyHeaderFlowLayout.m.

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

+0

Правильно. Использование 200 разрывов эффект параллакса. Использование 1 вместо 0, похоже, решает проблему. Спасибо за вашу помощь. – andreamazz

+8

Это не ответ на вопрос :-( –

15

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

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

+14

На самом деле это было бы только быстрым, но не хорошим исправлением, потому что автоматически сгенерированное ограничение требует, чтобы ширина ячейки была 0, что не то, что я хочу. – Goodsquirrel

+0

путь, если пользовательские ограничения имеют более низкий приоритет сейчас, почему бы Auto Layout не установить ширину метки в 0, в соответствии с ее более высоким приоритетом системного ограничения? – Alexey

+0

@Goodsquirrel Прошли ли вы с этим? – ray

0

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

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

1

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

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

Смежные вопросы