Применение ограничений автоматического макета в иерархии представлений

У меня есть две кнопки, размер которых я хочу сохранить, но проблема в том, что у них два разных родительских представления. Autolayout, кажется, игнорирует ограничение «равного размера» в этом сценарии. Ограничение кнопок с одним и тем же родительским представлением работает просто отлично.

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

Ограничения для первого и второгоОграничения для трех

Как видно из приведенного выше, для кнопок Два и Три задано такое же ограничение размера, что и для кнопки Один. Единственное отличие состоит в том, что кнопка Три находится внутри другого NSView. Нет ограничений по ширине, связывающих кнопку Three и содержащее ее представление.

Однако, когда я запускаю и изменяю размер окна, оно выглядит так:

Запуск приложения

Неважно, использую ли я макет Interface Builder или делаю это в коде, используя метод -[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:].

Что мне не хватает? Это не поддерживается Autolayout? Большое спасибо.

Отредактировано: добавлен снимок экрана, показывающий ограничения кнопки Three.


person Craig Edwards    schedule 26.03.2014    source источник
comment
Ваши ограничения, связанные с кнопкой Three и ее родительским представлением, должны иметь приоритет. Можете ли вы подробно их нам, пожалуйста? Кстати, как ты сделал анимированный gif?   -  person Max MacLeod    schedule 26.03.2014
comment
Я добавил еще один снимок экрана, показывающий ограничения кнопки Three. И я использовал LiceCap (cockos.com/licecap), чтобы захватить анимированный gif.   -  person Craig Edwards    schedule 26.03.2014
comment
возиться с этим. Скоро свяжемся   -  person Max MacLeod    schedule 26.03.2014


Ответы (1)


Это должно работать нормально. Я создал пример проекта, чтобы сделать то же самое. У меня есть три кнопки с одинаковыми ограничениями ширины между первой и второй кнопками. Затем то же самое между кнопкой два и кнопкой три. Первая кнопка имеет ограничение заднего края относительно родительского представления.

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

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

Результат можно увидеть ниже:

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

Вот ссылка на проект:

https://github.com/MaxMacleod/ThreeButtonConstraintTest1

Пара предостережений. Во-первых, это проект для iOS, а не для OS X (я фанат iOS!). Однако принципы должны быть одинаковыми. Во-вторых, это не указывает точную причину, по которой ваш проект не работает. Однако, если вы можете сравнить, что делает этот образец проекта с вашим, мы сможем понять это. Затем я обновлю этот ответ. Еще лучше, если бы вы могли сделать свой проект доступным, я был бы рад взглянуть.

person Max MacLeod    schedule 28.03.2014
comment
Как и вы, IB не позволял мне выбирать второе и третье представление в главном окне. Пришлось делать это с помощью левой навигации. Я скачал ваше приложение и сегодня посмотрю его (спасибо, что нашли время). Я также загрузил свое приложение на github.com/edwardaux/EnforcingLayout. Вскоре я сообщу об этом. . - person Craig Edwards; 29.03.2014
comment
посмотрел на ваш проект, и он выглядит отлично! В принципе, как у меня более-менее. Возможно, есть различия в реализациях Auto Layout после всех OS X и iOS. Я собираюсь попытаться найти что-нибудь в официальных документах... - person Max MacLeod; 31.03.2014
comment
К вашему сведению, я добавил пару новых коммитов в свой репозиторий. Первый из них (3d4ac05) выводит некоторую отладочную информацию о коммитах... кажется, что даже несмотря на то, что Xcode показывает ограничение третьей кнопки в построителе интерфейсов (как с использованием синих линий, так и в списке ограничений), во время выполнения на самом деле они не применяются (я использую NSLog для сброса ограничений времени выполнения). Второй коммит (e21fffd) отказывается от использования Interface Builder и добавляет ограничения программно, и теперь он работает. - person Craig Edwards; 01.04.2014
comment
довольно сумасшедший. Мне кажется, что это проблема с IB. Не могли бы вы написать кому-нибудь из руководителей Apple, которые выступали с презентациями на WWDC? Или, может быть, твит некоторых гуру Auto Layout, например. Эрика Садун. Может быть, даже поднять запрос радара? - person Max MacLeod; 01.04.2014