Выяснить, что означает центральное ограничение, когда множитель не равен 1,0, сложно. Я немного поэкспериментировал с Xcode 6 и вот мои выводы.
Рассматриваемое ограничение имеет вид A.center.x = B.center.x * m + c
, где A
и B
— задействованные представления, m
— множитель ограничения, а c
— константа ограничения.
Предположим, что center.x
B зафиксировано некоторыми другими ограничениями. Тогда я считаю, что autolayout ведет себя так, как если бы он использовал этот алгоритм:
Найдите ближайший общий предок A и B. Назовите этого общего предка G.
Пусть bxg = B.x.center в системе координат G. Вы можете вычислить это в коде как CGFloat bxg = [G convertPoint:B.center fromView:B.superview].x
.
Вычислите axg = желаемый x-центр A в системе координат G. CGFloat axg = bxg * m + c
.
Преобразуйте axg в систему координат A.superview
и сохраните ее как A.center.x
.
Итак, учитывая все это, как мы можем использовать центральные ограничения для достижения вашей цели «равномерно расположенных представлений»? Мы не знаем.
Вот в чем проблема. Предположим, что все три ваших подвида имеют одинаковую ширину, w. (Проблема усложняется, если они имеют разную ширину.) Допустим, представление контейнера имеет ширину W. Имеется четыре поля (одно слева от самого левого подвида, одно между левым и средним подвидами, одно между средний подвид и правый подвид, и один справа от правого подвида.)
Таким образом, ширина поля должна быть (W - 3 w)/4. Затем мы хотим каким-то образом включить это в другое ограничение. Вы хотели использовать ограничение по центру, но для простоты давайте рассмотрим ограничение по левому краю самого левого вида L. Мы хотим, чтобы ограничение было L.left = (W - 3 w) / 4. Это ограничение слишком сложно для autolayout для обработки напрямую. Ограничения автомакета могут включать только два атрибута представления, а здесь — три.
Решение состоит в том, чтобы ввести проставки. Давайте начнем с наших трех желаемых подпредставлений:
![начальные просмотры](https://i.stack.imgur.com/ffZko.png)
Я уже ограничил размер каждого из этих трех подпредставлений размером 80x80 и отцентрировал их по вертикали.
Теперь я добавлю четыре распорки, показанные серым цветом:
![добавлены разделители](https://i.stack.imgur.com/oeZdf.png)
Я ограничил высоту и вертикальный центр каждой прокладки, но не ограничил их ширину. Далее я сделаю так, чтобы все прокладки имели одинаковую ширину:
![равной ширины](https://i.stack.imgur.com/84bJe.gif)
Затем я прикреплю передний и задний края каждого разделителя к его ближайшим соседям, вручную установив константы равными нулю. Вот как я делаю первую распорку:
![края распорки](https://i.stack.imgur.com/HKYVR.gif)
Я делаю то же самое для трех других прокладок. Я не буду показывать это здесь.
Когда я выбираю контроллер представления и прошу Xcode обновить все кадры, я получаю равномерно распределенные представления:
![обновить кадры](https://i.stack.imgur.com/9Eca1.gif)
Поскольку я на самом деле не хочу, чтобы разделители были видны во время выполнения, я выберу их и сделаю их скрытыми. Скрытые представления по-прежнему участвуют в макете.
![скрыть разделители](https://i.stack.imgur.com/012MW.gif)
А что, если вложенные представления не имеют одинаковой ширины? Давайте изменим ширину синего подвида:
![изменить ширину синего подпредставления](https://i.stack.imgur.com/kvMv0.gif)
Автоматическая компоновка обновляет рамы, чтобы прокладки по-прежнему имели одинаковую ширину.
person
rob mayoff
schedule
19.09.2014