в последнее время попадают в автопрокладку, и я застрял на том, что кажется действительно тривиальным примером проблемы. У меня есть мнение, что я хочу сесть в верхней части экрана и занять половину высоты экрана. Просто перед автоматическим размещением - просто прикрепите его на место и скажите, чтобы он расширялся по вертикали при изменении размера супервизора.
Теперь, хоть убей, я не могу понять, как это сделать. Вот что я получаю, когда пытаюсь это настроить:
Ограничение нижнего пространства установлено на «равно 284», что является абсолютным и абсолютно бесполезным для меня, когда я перехожу на макет iPhone4, поскольку он сохраняет пространство в 284 точки внизу экрана и сжимает вид, чтобы он больше не составлял половину размер экрана. И нет никакого способа установить это ограничение равным некоторой части высоты любого другого вида.
После некоторой борьбы я могу придумать, как это сделать, - это ввести еще один вид под этим видом, закрепить их высоту одинаково, заставить их сидеть выше и ниже друг друга, а затем сделать второй (нижний) вид невидимым. .. что кажется немного некрасивым!
Я упускаю что-то очевидное? ..
источник
Ответы:
Теперь это возможно в IB с [по крайней мере] Xcode 5.1.1. Хотя мне потребовалось время, чтобы понять, что на самом деле это очень просто:
Сначала создайте базовое ограничение выравнивания по верхнему краю (вам также потребуется установить ограничения по нижнему, левому и правому краям, как обычно). Затем выберите ограничение и перейдите к инспектору атрибутов :
Затем вы можете настроить множитель. Если вы хотите, чтобы 50% супервизора оставалось равным
1
, так как оно выровнено по центру супервизора. Это также отличный способ создавать просмотры с другими процентными значениями (например, 25% супер-просмотра).источник
First Item
этоView.Top
не такView.Center Y
. В противном случае да, он просто будет центрировать его. Вам также необходимо убедиться, что другие ограничения установлены правильно для обработки других краев вида.Решение для раскадровки, в котором вы можете установить точное соотношение между любыми видами:
Сейчас же:
ПРИБЫЛЬ !!!
PS Также обратите внимание, что этот метод работает с представлениями на разных уровнях вложенности и (очевидно) применим для ширины
PPS иногда может быть полезно «поменять местами первый и второй элементы» ограничения или установить обратный множитель (например, 2 вместо 0,5) (но эти методы бесполезны, если вы не понимаете, как представления связаны друг с другом).
источник
Спустя немного времени я пришел к следующему.
Я отмечаю это как ответ, но он не очень удовлетворительный, поскольку предполагает, что вы на самом деле не можете сделать это в Interface Builder, но правильное ограничение можно добавить в код впоследствии как:
- (void) viewWillAppear:(BOOL)animated { NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:upperview attribute:NSLayoutAttributeHeight relatedBy:0 toItem:self.view attribute:NSLayoutAttributeHeight multiplier:.5 constant:0]; [self.view addConstraint:constraint]; }
По сути, он устанавливает множитель 0,5 против высоты self.view, действуя на верхний вид. Мне пришлось установить приоритет ограничения нижнего вертикального пространства в IB ниже 1000, чтобы избежать кучи сообщений времени выполнения о нарушении ограничений.
Так что, если кто-нибудь может показать, как это сделать в Интерфейсном Разработчике, это лучше ответит на мой вопрос, иначе я думаю, это так же хорошо, как и получается (на данный момент) ???
источник
Немного проще и прямолинейнее, чем метод, чем ответ Федора Волчёка. -Удерживая кнопку управления, нажмите на подвид. -Удерживая нажатой кнопку команды, перетащите курсор на супервизор, затем нажмите на супервизор. -Выберите «Соотношение сторон».
-Затем нажмите «Инспектор размеров». -Затем дважды щелкните ограничение.
-Убедитесь, что для обоих пунктов выбрана "высота".
-Затем измените "Multiplier" на 0,5 для половины экрана или любой другой части супервизора, которую вы хотите.
источник
Есть еще одна возможность в коде, если у вас есть 2 представления, которые должны иметь одинаковую высоту: просто установите высоту view2 на высоту view1 (трюк здесь не в установке высоты view1 явно).
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]" options:0 metrics:nil views:viewsDict]];
источник
Быстрая версия ответа Мете:
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. upperView.translatesAutoresizingMaskIntoConstraints = false var constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.height, multiplier: 0.5, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0) self.view.addConstraint(constraint) constraint = NSLayoutConstraint(item: upperView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0) self.view.addConstraint(constraint) }
источник