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

Как использовать автомасштабирование, чтобы начать просмотр в половине своего супервизора?

У меня есть представление внутри представления:

+--------------+
|              |
|       +-----+|
|       |     ||
|       +-----+|
+--------------+

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

innerView.frame.size.width = outerView.frame.size.width/2;
innerView.frame.origin.x = outerView.frame.size.width/2;

Как я могу выразить это с помощью автоматической компоновки?

4b9b3361

Ответ 1

Я не думаю, что вы можете сделать это в Interface Builder, но это довольно легко сделать, создав ограничения в коде.

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

Мы используем атрибут NSLayoutAttributeTrailing вместо NSLayoutAttributeRight, поэтому ваш интерфейс будет корректно переворачиваться при локализованном RTL.

// innerView.width = outerView.width * 0.5
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:innerView
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:outerView
                             attribute:NSLayoutAttributeWidth
                            multiplier:0.5
                              constant:0];

// innerView.trailing = outerView.trailing
NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:innerView
                             attribute:NSLayoutAttributeTrailing
                             relatedBy:NSLayoutRelationEqual
                                toItem:outerView
                             attribute:NSLayoutAttributeTrailing
                            multiplier:1.0
                              constant:0];

[outerView addConstraints:@[widthConstraint, rightConstraint]];

Ответ 2

Вы действительно можете сделать это в IB/Storyboards еще в Xcode 5.1 (возможно, ранее)

  • Создать ограничение ширины между представлением и супер-представлением
  • Установите для этого отношения значение "Равно"
  • Задайте константу "0"
  • Установите мультипликатор на "2: 1" или "1: 2" (в зависимости от порядка предметов в ограничении)

IB, по-видимому, только позволяет устанавливать мультипликаторы на целые числа или отношения, а не на числа с плавающей запятой. Здесь крышка экрана для большей ясности

Constraint setting for width half it's parent

Примечание: если "Первый элемент" и "Второй элемент" перевернуты, соотношение "2: 1"

Ответ 3

Вы можете поместить в середину родительского представления и удалить все настройки автоопределения в построителе интерфейса. Он будет всегда в том же положении, если вы его повернете.