2013-11-27 4 views
1

У меня этот TabBarController в моем приложении, к которому я добавил UIView на самой верхней части TabBar. Я сделал это, потому что в этом представлении отображаются постоянные данные, которые я хотел отображать во всех представлениях. Я инициализировал это с помощью initWithFrame:, и это именно то, где я хотел.iOS программно добавляет ограничения, приводящие к ошибке

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

[[self view] addConstraints:[NSLayoutConstraint 
        constraintsWithVisualFormat:@"V:[_myView]-(44)-|" 
             options:NSLayoutFormatDirectionLeadingToTrailing 
             metrics:nil 
              views:NSDictionaryOfVariableBindings(_myView)]]; 

Таким образом, я бы ожидать, что MyView всегда будет находиться на расстоянии 44 очков от нижней части экрана, однако этого не происходит.

отладчик показывает:

Невозможно одновременно удовлетворяют ограничениям.

Возможно, по крайней мере одно из ограничений в следующем списке - это тот, который вы не хотите. Попробуйте это: (1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете; (2) найти код, который добавил нежелательные ограничения или ограничения и исправить его. (Примечание: Если вы видите NSAutoresizingMaskLayoutConstraints, что вы не понимаете, обратитесь к документации по UIView собственности translatesAutoresizingMaskIntoConstraints)

(
    "< NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-| (Names: '|':UIView:0x166dd460)>", 
    "< NSAutoresizingMaskLayoutConstraint:0x165a7ce0 h=--& v=--& UIView:0x165bda30.midY == + 507>", 
    "< NSAutoresizingMaskLayoutConstraint:0x165c50c0 h=--& v=--& V:[UIView:0x165bda30(34)]>", 
    "< NSAutoresizingMaskLayoutConstraint:0x165c3a90 h=-&- v=-&- UIView:0x166dd460.height == UIWindow:0x1668f870.height - 20>", 
    "< NSAutoresizingMaskLayoutConstraint:0x165a8070 h=--- v=--- V:[UIWindow:0x1668f870(568)]>" 
) 

будет пытаться восстановить разбив Constraint < NSLayoutConstraint:0x165c0280 V:[UIView:0x165bda30]-(44)-| (Names: '|':UIView:0x166dd460)>

Перерыв на objc_exception_throw поймать это в отладчике. Методы в категории UIConstraintBasedLayoutDebugging в списке UIView, также могут быть полезны.

Эта ошибка отображается только при расширении строки состояния. Других ограничений, добавленных программно, нет, а VC Interface Builder для этого класса пуст. Все добавляется программно.

Это сводит меня с ума!

ответ

3

Необходимо указать setTranslatesAutoresizingMaskIntoConstraints: на вид с параметром NO. Это предотвратит автоматическое добавление NSAutoresizingMaskLayoutConstraint s, которое вы видите в журнале (так что будут применяться только ваши явные ограничения).

+0

Я сделал это, но вид тогда вообще не показывался. Но когда вы сказали «только явные ограничения», я понял, что тогда мне также нужно будет указать высоту, ширину и начало координат. Теперь он работает как ожидалось! Благодарю. – Guilherme

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