Автомакет — положение в процентах

Я хотел бы отобразить точки вдоль линии.

линия на экране

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

До сих пор я обнаружил, что ограничения определяются только в каком-то значении точки (Документ)

Можно ли также использовать процентные значения в качестве ограничений? Любые идеи о том, как расположить эти точки масштабируемым образом... или мне нужно сделать это преобразование/позиционирование "вручную"?


person Bernd    schedule 07.07.2013    source источник


Ответы (2)


Да, вы можете расположить точку как часть ширины представления. Метод NSLayoutConstraint, limitedWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:, имеет параметр multiplier, который позволяет вам использовать дробную связь между суперпредставлением и его подпредставлением. Правый край суперпредставления будет шириной этого представления (экрана, если это представление полной ширины), поэтому, если вы создадите ограничение, как показано ниже, точка будет расположена на дробном расстоянии вдоль линии:

-(void)viewDidLoad {
      [super viewDidLoad];
      [self.view removeConstraint:self.leftConDark];
      [self.view removeConstraint:self.leftConLight];
      NSLayoutConstraint *lcd = [NSLayoutConstraint constraintWithItem:self.darkButton 
                                                             attribute:NSLayoutAttributeCenterX 
                                                             relatedBy:NSLayoutRelationEqual 
                                                                toItem:self.view 
                                                             attribute:NSLayoutAttributeRight 
                                                            multiplier:.5 
                                                              constant:0];
      NSLayoutConstraint *lcl = [NSLayoutConstraint constraintWithItem:self.lightButton 
                                                             attribute:NSLayoutAttributeCenterX 
                                                             relatedBy:NSLayoutRelationEqual 
                                                                toItem:self.view 
                                                             attribute:NSLayoutAttributeRight 
                                                            multiplier:.9 
                                                              constant:0];
      [self.view addConstraints:@[lcd,lcl]];
}

В этом примере я позиционирую две кнопки UIButton (темная и светлая информация). Я добавил их в IB и сделал IBOutlets с их ограничениями, которые у них есть, в левой части представления (это то, что мне дала система, это могло быть в правой части - это не имеет значения, так как вы все равно просто удаляете их , Если вы делаете точки в коде, вам не нужно этого делать). В коде я удаляю эти ограничения, а затем добавляю новые, которые будут помещать центр кнопок на 50% и 90% пути по экрану.

person rdelmar    schedule 07.07.2013
comment
+1 Я согласен с использованием multiplier и NSLayoutAttributeRight (хотя я мог бы сделать от NSLayoutAttributeCenterX до NSLayoutAttributeRight, но Бернд, несомненно, понял эту идею). Замечательно. - person Rob; 07.07.2013
comment
@Rob, спасибо за исправление - я иногда забываю, что обновляется, когда речь идет о кадрах и границах. Я думал, что NSLayoutAttributeRight представления не будет отражать правильное значение при повороте, если только код не находится в viewWillLayoutSubviews. - person rdelmar; 07.07.2013
comment
@Rob, еще раз спасибо - не нужно прощения, я все еще пытаюсь понять ограничения макета. Я обновил ответ. - person rdelmar; 07.07.2013
comment
Вам не нужно удалять ограничения напрямую. В IB выберите ограничения-заполнители по одному (щелкните стрелку с шестеренкой вниз и выберите «Выбрать и отредактировать...»), затем установите флажок «Удалить во время сборки». - person capikaw; 19.02.2014
comment
@rdelmar Спасибо за отличный ответ. Работает как шарм. Мне было интересно, можно ли добиться того же самого из IB вместо добавления ограничений программным путем? - person Isuru; 30.10.2014
comment
@Isuru, да, теперь вы можете сделать это в IB (я не уверен, что это было возможно в то время, когда я писал этот ответ). Сделайте ограничение между центром представления и концом суперпредставления. Отредактируйте ограничение и присвойте ему множитель любой доли пути по экрану, на котором вы хотите разместить представление. Установите константу на 0. - person rdelmar; 30.10.2014
comment
@rdelmar Не могли бы вы уточнить, как установить ограничение между centerX представлений и окончанием суперпредставления? Я не могу найти, как это сделать. - person Isuru; 30.10.2014
comment
@Isuru, ты делаешь это похоже на то, как ответил Грег. Сделайте обычное ограничение замыкания-замыкания, а затем дважды щелкните ограничение в инспекторе размеров, чтобы отобразить подробное представление, которое Грег показывает в своей точке 4. Затем вы можете изменить замыкание на centerX для своего представления и изменить константу и множитель, как ты хочешь. Возможно, вы захотите переключить, какой элемент будет первым — если вы думаете об этом как о части пути по экрану, тогда вы хотите, чтобы первый элемент был вашим представлением, а не суперпредставлением. - person rdelmar; 30.10.2014

Я не эксперт по автоматической компоновке (и даже не компетентен!), но с XCode 6 вы, похоже, можете сделать это в IB.

  1. Выберите объект.
  2. Показать инспектор размера (нажмите на линейку) инспектор размера

  3. Дважды щелкните прямоугольник ограничения (неочевидно! «Редактировать» приведет вас в другое место)

ограниченный прямоугольник

  1. Здесь вы можете установить множитель так же, как в ответе выше.

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

person Greg Bell    schedule 05.10.2014