Невозможно одновременно удовлетворить ограничения, попытается восстановить, нарушив ограничение

Ниже приведено сообщение об ошибке, которое я получаю в области отладки. Он работает нормально, и ничего не происходит, за исключением того, что я получаю эту ошибку. Не помешает ли Apple принять приложение? Как это исправить?

2012-07-26 01:58:18.621 Rolo[33597:11303] 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:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>",
    "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>",
    "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>",
    "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>",
    "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>",
    "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>",
    "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>",
    "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>

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.

Ответ 1

Я бы рекомендовал отлаживать и находить, какое ограничение "тот, который вам не нужен" . Предположим, у вас есть следующая проблема:

enter image description here

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

Есть два решения, как это сделать:

  • ИДЕНТИФИКАЦИЯ ПРОСМОТРА ВИДЕО (не рекомендую этот способ)

Поскольку вы знаете, где найти неожиданные ограничения (PBOUserWorkDayHeaderView), есть способ сделать это достаточно хорошо. Найдем UIView и NSLayoutConstraint в красных прямоугольниках. Поскольку мы знаем их id в памяти, это довольно просто.

  • Остановить приложение с помощью Иерархия просмотра отладки:

enter image description here

  • Найдите правильный UIView:

enter image description here

  • Следующее - найти NSLayoutConstraint, о котором мы заботимся:

enter image description here

Как вы можете видеть, указатели на память одинаковы. Поэтому мы знаем, что происходит сейчас. Кроме того, вы можете найти NSLayoutConstraint в иерархии представлений. Поскольку он выбран в представлении, он также выбирается в Navigator.

enter image description here

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

(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

Вы можете сделать то же самое для каждого ограничения, которое отладчик укажет на вас:-) Теперь вы решаете, что с этим делать.

  1. ПЕЧАТЬ ЛУЧШЕ (я действительно рекомендую этот путь, это Xcode 7)

    • установить уникальный идентификатор для каждого ограничения в вашем представлении:

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

  • создать простое расширение для NSLayoutConstraint:

SWIFT:

extension NSLayoutConstraint {

    override public var description: String {
        let id = identifier ?? ""
        return "id: \(id), constant: \(constant)" //you may print whatever you want here
    }
}

OBJECTIVE-C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • постройте его еще раз, и теперь у вас есть более читаемый вывод для вас:

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

  • После того, как вы получили свой id, вы можете просто коснуться его в Навигаторе поиска:

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

  • и быстро найти его:

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

КАК ПРОСТО УСТАТЬ СЛУЧАЙ?

  • попробуйте изменить приоритет на 999 для сломанного ограничения.

Ответ 2

Проблема, с которой вы сталкиваетесь, - NSAutoresizingMaskLayoutConstraints, не должна быть там. Это старая система пружин и распорок. Чтобы избавиться от него, запустите этот метод для каждого представления, которое вы хотите ограничить:

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

Ответ 3

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

Например: Вертикальное ограничение для трейлинга = 15, а другое → = 10.

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

enter image description here

Дополнительно, вы можете читать и обнаруживать некоторые определенные причины, непосредственно из журнала:

NSLayoutConstraint: 0xa338390 V: | - (15) - [UILabel: 0xa331260] (имена: '|': UILabel: 0xa330270) >

Это мы можем рассматривать как проблему в ограничении UILabel, это ведущее вертикальное ограничение имеет длину 15pt.

NSLayoutConstraint: 0x859ab20 H:-( 13) - | [UIView: 0x85a8fb0]...

Это будет тянуть горизонтальное ограничение и т.д.

Ответ 4

У меня была эта проблема, потому что мои файлы .xib использовали автозапуск.

В инспекторе файлов первая вкладка. Неиспользование "Использовать автозапуск" решило проблему.

autolayout file inspector

Ответ 5

У меня было довольно много таких исключений, самый быстрый и простой способ найти их - найти уникальные значения в исключениях, которые я искал в исходном коде раскадровки. Это помогло мне найти фактический вид и ограничения (-ы), вызывающие проблему (я использую значимые userLabels во всех представлениях, что значительно облегчает отслеживание ограничений и представлений)...

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

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

.. это выглядит как вертикальное (V) ограничение на UILabel со значением (17).

Просматривая исключения, я также нахожу

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

Похоже, что UILabel (0x72bf7c0) близок к UIButton (0x886efe0) с некоторым вертикальным интервалом (8)..

Этого, я надеюсь, будет достаточно для того, чтобы найти конкретные взгляды в исходном коде для раскадровки (возможно, путем поиска текста для "17" изначально) или, по крайней мере, нескольких вероятных кандидатов. Оттуда я должен был бы действительно выяснить, какие взгляды они находятся в раскадровке, что значительно облегчит определение проблемы (ищите "дублированные" пиннинг или фиксацию, которые конфликтуют с ограничениями размера).

Ответ 6

Мне было трудно выяснить, какие ограничения вызывали эту ошибку. Вот более простой способ сделать это.

Я использую Xcode 6.1.1

  • "Команда + А", чтобы выбрать все UILabels, UIImages и т.д.
  • Нажмите Редактор → Вывод > (Выбрать...) в Superview
  • снова щелкните "Редактор" → "Разрешить проблемы автоматического макета" → "Добавить отсутствующие ограничения" или "w70" в "Предлагаемые ограничения". Это зависит от вашего дела.

Ответ 7

Вот мой опыт и решение. Я не коснулся кода

  • Выберите вид (UILabel, UIImage и т.д.)
  • Редактоp > Вывод > (Выбрать...) в Superview
  • Редактоp > Устранение проблем с автоматической компоновкой > Добавить отсутствующие ограничения

Ответ 8

используйте быстрый код

view.translatesAutoresizingMaskIntoConstraints = false

Ответ 9

Я следил за вопросами и ответами из каждого поискового запроса. Но все они связаны с конкретным.

В основном, я имею в виду, прежде чем вы собираетесь записать формат (может быть простой), он даст вам предупреждения.

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

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

// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];

Я много искал в SO, но решение было в Пример кода Apple.

Таким образом, вы должны удалить ограничения по умолчанию, прежде чем планируете добавлять новые.

Ответ 10

Для меня основной причиной этой проблемы было то, что я забыл снять отметку AutoLayout в редакторе Xib. Фактически, я сделал много настроек кода Xib в коде.

Ответ 11

 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

Это помогло мне уловить представление, вызвавшее проблему.

Ответ 12

быстрый 4

Я просто добавляю эту строку в viewDidLoad и отлично работаю со мной.

view.removeConstraints(view.constraints)

Ответ 13

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

myView.removeConstraint(theConstraint)

он ничего не удалял, потому что мне нужно было позвонить

myView.superView.removeConstraint(theConstraint)

поскольку ограничение было технически связным ограничением моего представления.