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

Невозможно одновременно удовлетворить ограничения - ограничений нет

Я прошел и удалил все ограничения пользователя, но после поворота устройства я все еще получаю следующую ошибку ТОЛЬКО. Я не знаю, почему. У кого-нибудь есть идеи?

2013-01-14 21:30:31.363 myApp[35869:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (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 and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>",
    "<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>",
    "<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260]   (Names: '|':UIView:0xa330270 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
4b9b3361

Ответ 1

Посмотрим на них один за другим.

"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"

Это говорит, что вид 0xa330270 (A) должен быть на 768 пунктов выше.

"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )>"

Это говорит о том, что нижний край 0xa331260 (B) должен быть пробелом -1 от дна A, который является надстройкой.

"<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270 )>"

Это говорит о том, что верхний край B должен быть пробелом в 841 балл от вершины своего супервизора, A.

Эти три вещи не могут быть правдивыми - A не может быть 768 точек в высоту и содержать подвью с верхним краем 841 пунктирная вставка из верхней и -1 точки вставки из дно. Где вы определили каждое из этих ограничений?

Вы не сказали, какой макет вы пытаетесь достичь, но похоже, что у вас может быть маска авторезиста в супервизии, которая предотвращает ее изменение высоты при повороте устройства. Насколько я знаю, ограничения авторазрешения появляются только в том случае, если вы добавили представления программным образом, поскольку раскадровка или xib либо полностью автоматизированы, либо нет. Если вы не делаете что-то вроде добавления автоматически выложенного представления (загруженного из ниба?) В другое представление из файла non-autolayout nib?

Ответ 2

благодаря http://useYourLoaf.com для этого полного решения:

http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html

Быстрый совет, который я нашел похожей на сессию WWDC 2015 в Auto Layout, которая помогает при отладке проблем с ограничениями

Если вы использовали Auto Layout, вы будете знакомы с журналом, который выдает Xcode, когда вы получаете что-то неправильно. Чтобы создать пример, я модифицировал мой пример кода образца стека и добавил ограничение на каждое из изображений, чтобы дать им фиксированную ширину 240 (не хорошая идея, как мы увидим).

введите описание изображения здесь

Это работает в виде обычной ширины, такой как iPad, но слишком широк для компактного просмотра ширины, такого как iPhone в портрете. Журнал консоли во время выполнения не является интересным для чтения. Пропуская текст шаблона, вы получите список проблемных ограничений:

"<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>",
"<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>",
"<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>",
"<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>",
"<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>",
"<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>",
"<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-|   (Names: '|':UIStackView:0x7fc1ab531a10 )>",
"<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>",
"<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>",
"<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>",
"<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>"

Затем журнал сообщает вам, какое из указанных выше ограничений он решил сломать:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>

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

Добавление идентификатора в ограничение

Журнал становится намного легче понять, если вы добавляете идентификатор для каждого ограничения (NSLayoutConstraint имеет свойство идентификатора с iOS 7). В Interface Builder найдите ограничение и добавьте идентификатор в инспекторе атрибутов (я использую $в качестве префикса/суффикса, чтобы выделить их в журнале):

введите описание изображения здесь

Обновление 18 августа 2015 года. Как указано в комментариях, идентификатор можно редактировать только в Interface Builder, начиная с Xcode 7. Он не отображается в Xcode 6.4.

Если добавить ограничение в код:

constraint.identifier = "$HeartImageFixedWidth$"

Это сложнее, если вы используете язык визуального формата, который использует массивы ограничений. Например, рассмотрим фрагмент кода Swift, чтобы создать ограничение фиксированной ширины для представления изображения с сердцем:

let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]", 
                 options:[], metrics:nil, views:viewsDictionary)

Так как heartWidth - это массив типа [NSLayoutConstraint], то идентификатор - это немного больше работы:

for constraint in heartWidth {
  constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)

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

"<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>",
"<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>",
"<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>",
"<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>",
"<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>",
"<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>",
"<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-|   (Names: '|':UIStackView:0x7f92a30472b0 )>",
"<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>",
"<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>",
"<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>",
"<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>"

Кроме того, гораздо яснее, какое из ограничений, которое система выбрала для разбиения:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>

Добавление идентификаторов к ограничениям не без усилий, но оно может окупиться в следующий раз, когда вам придется сортировать журнал отладки сложного макета.

Дополнительная литература

Ответ 3

Я предполагаю, что это не обычная ошибка, но я решил ее немного неспециалистом. Я получал загадочные сообщения, подобные приведенным выше. Чтобы понять это, я создал классы фиктивного представления и привязал его к представлениям в своем раскадровке. Например, если у меня был UIView, я создал класс AddressView и привязал его к этому представлению в доске объявлений. Это было немного времени, но это сработало для меня. После этого вместо объектов-идентификаторов, я получил имена классов, которые помогли мне с нуля в взглядах, которые вызывали проблему очень легко. Теперь мое сообщение об ошибке читается,

2013-07-02 04:16:20.434 Myproject [2908:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (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 and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x9edeae0 V:|-(0)-[AddressView:0x143ee020]   (Names: '|':MainView:0x129eb6a0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x11e998c0 h=--& v=--& V:[MainView:0x129eb6a0(704)]>",
    "<NSLayoutConstraint:0x156720b0 V:[AddressView:0x143ee020]-(896)-|   (Names: '|':MainView:0x129eb6a0 )>"
)

Здесь вы можете увидеть, что имена моих представлений MainView и Address view вызывают проблему.

Чтобы решить эту проблему, я просто переместил мое подвью (в этом случае Address view) и переместил его обратно. Я думаю, что проблема началась, когда я использовал сочетание нового автоматического Layour в Xcode 4.5 и старые навыки или вручную позиционировал представления.

В любом случае, не уверен, что это было больше удачи, чем усердие, но, тем не менее, это может быть другой способ отладки. Может быть, это помогает кому-то!

Ответ 4

Его стоит знать основы и понять, что Apple/Xcode пытается рассказать вам через журналы

H = Horizontal constraint(for leading and Trailing)
V = Vertical constraint(top and bottom edge)
h = height
w = width

TopEdge    -> V:|-(points)-[VIEW:memoryAddress] 
BottomEdge -> V:[VIEW:memoryAddress]-(points)-|
Leading    -> H:|-(points)-[VIEW:memoryAddress] 
Trailing   -> H:[VIEW:memoryAddress] -(points)-|
height     -> h= --& v=--& V:[VIEW:memoryAddress((points)] 
width      -> VIEW:memoryAddress.width == points 
between    -> H:[VIEW 1]-(51)-[VIEW 2] 

Как только вы это понимаете, чтение вашей конкретной ошибки довольно легко

Ответ 5

YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;

Сделал это для меня.

Ответ 6

Я исправил эту проблему, удалив все свойства translatesAutoresizingMaskIntoConstraints из xib файла (Open xib как исходный код).

Ответ 7

Одно примечание. Вы получаете эту ошибку в журналах, если вы тестируете с использованием личного подключения к точке доступа, а строка состояния hotspot находится наверху. Он сбрасывает ограничения.

Надеюсь, что это помогает кому-то... сводил меня с ума.

Ответ 8

Для меня эта ошибка была выявлена, когда я дал tableView.estimatedRowHeight = UITableViewAutomaticDimension

Это должно было быть tableView.estimatedRowHeight = "Some hardcoded value"

Ответ 9

У меня была эта проблема, и мне потребовалось 2 дня, чтобы выяснить источник проблемы....

Если вы открываете раскадровку программно в своем коде, просто убедитесь, что вы делаете это следующим образом:

UIStoryboard *story = [UIStoryboard storyboardWithName:@"MovieMaker" bundle:nil];
    UIViewController *vc = [story instantiateInitialViewController];
    //this causes layout to break [self presentViewController:vc animated:YES completion:nil];
    [self showViewController:vc sender:nil];

Я использовал закомментированную строку (с использованием presentViewController), и произошла ошибка ориентации, приводящая к возникновению конфликтов ограничений, которые не были моими ограничениями... при переходе на showViewController все конфликты ограничений исчезли, и ориентация работает...... не знаю, почему он работает с шоу и не присутствует... все еще думает, что это... Чужие...)

Ответ 10

Эта проблема сгенерированного сообщения "Невозможно одновременно удовлетворить ограничения" в консоли отладки также встречается в XCode 9.4.
В моем конкретном случае на симуляторе iPad сообщение будет сгенерировано:
1) Только при размещении фокуса на определенном UITextField.
2) Даже со всеми видимыми ограничениями.
2) Даже при всех ограничениях просмотра "Сбросить до рекомендуемых ограничений".

Однако, когда программная клавиатура была включена для отображения, сообщение не будет сгенерировано. Следовательно, сколько времени я должен потратить на эту проблему, которая в моем случае генерируется только при выключенной программной клавиатуре.