Autolayout - сделать высоту просмотра относительно половины высоты надписи

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

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

autolayout blues

Ограничение нижнего пространства установлено на "равно 284", что абсолютно и абсолютно бесполезно для меня, когда я перехожу на макет iPhone4, поскольку он удерживает 284 точки в нижней части экрана и сжимает представление больше на половину размера экрана. И нет способа установить это ограничение равным некоторой части любой другой высоты представления.

Потерпев некоторое время, единственный способ, которым я могу это сделать, - представить другой вид под этим видом, выровнять их высоты одинаково, заставить их сидеть выше и ниже друг друга, а затем установить второй (снизу) вид быть невидимым.., что кажется немного уродливым!

Я пропустил что-то очевидное?..

Ответ 1

Теперь это возможно в IB по [по крайней мере] Xcode 5.1.1. Хотя мне понадобилось время, чтобы понять, что на самом деле это просто супер:

Сначала создайте основное ограничение верхнего выравнивания (вам также нужно будет установить нижние, левые и правые ограничения, как обычно) , Затем выберите ограничение и перейдите к инспектору Атрибут:

Demonstration of steps above

Затем вы можете настроить множитель. Если вы хотите, чтобы 50% супер-представления оставляли его на 1, так как оно выровнено по суперцентру. Это также отличный способ создания представлений, которые также являются другими процентами (например, 25% супер-представления).

Demonstration of second step above

Ответ 2

Решение раскадровки, где вы можете установить точное соотношение между любыми видами:

Set height equality constraint

Сейчас:

Edit constraint's multiplier

PROFIT!!!

Result

P.S. Также обратите внимание, что этот метод работает с представлениями на разных уровнях вложенности и (очевидно) применимыми для ширины

P.P.S. иногда бывает полезно "отменить первый и второй элемент" ограничения или установить обратный множитель (например, 2 вместо 0,5) (но эти методы не помогают, если вы не понимаете, как представления связаны между собой).

Ответ 3

После немного больше времени я придумал следующее.

Я отмечаю это как ответ, но это не очень удовлетворительно, так как предполагается, что вы не можете это сделать в 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, чтобы избежать кучи сообщений о времени выполнения, связанных с ограничениями на разрыв.

Итак, если кто-нибудь может показать, как это сделать в Interface Builder, это лучше ответит на мой вопрос, иначе я думаю, что это так хорошо, как это получается (на данный момент)???

Ответ 4

Там у меня также есть другая возможность в коде, если у вас есть 2 вида, которые должны иметь одинаковые высоты: просто установите высоту view2 в высоту view1 (трюк здесь не устанавливает высоту представления1 явно).

    [self.view addConstraints:[NSLayoutConstraint
        constraintsWithVisualFormat:@"V:[topLayoutGuide]-0-[_view1]-0-[_view2(==_view1)]-0-[bottomLayoutGuide]"
                            options:0
                            metrics:nil
                              views:viewsDict]];

Ответ 5

Чуть проще и более прямолинейно, чем метод, чем ответить Федор Волчек. -Установите кнопку управления и нажмите на подвью. -Удерживая нажатие на командную кнопку, перетащите курсор в супервизор, затем нажмите на супервизор. -Выберите "Соотношение сторон".

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

-Тогда щелкните "Инспектор размеров". -Тогда дважды нажмите на ограничение. введите описание изображения здесь

-Убедитесь, что для обоих элементов выбрана "высота". введите описание изображения здесь

- Затем измените значение "Множитель" на 0,5 на половину экрана или на какую-либо часть вашего супервизора. введите описание изображения здесь

Ответ 6

Быстрая версия ответа Mete:

    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)


}