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)
}