Автозапуск iOS: два вида одинаковой ширины и с одинаковым интервалом

#ios #xcode-storyboard #ios-autolayout

#iOS #xcode-раскадровка #ios-автозапуск

Вопрос:

В настоящее время у меня возникают трудности с автозапуском. Я использую interface builder и пытаюсь разместить два блока uiview размером 100 * 100. Мне нужны эти блоки, размещенные таким образом, чтобы 1-й блок, ведущий к супервизору, равнялся 2-му блоку, ведущему к супервизору.Далее это равно пространству между этими двумя блоками и одинаково изменяется в зависимости от ширины экрана. Я пытался использовать stackview, который дает фиксированную ширину для stackview, кажется, одинаково разнесен на 4s, но не на 6s.Сохранение ширины не фиксированной приводит к большему расстоянию между блоками, как здесь .

Возможно ли добиться этого с помощью Interface builder? Большое спасибо за любую помощь.

Комментарии:

1. Должны ли изменяться высота и ширина представлений внутри stackview или они должны оставаться фиксированными на некоторых заранее определенных значениях?

2. Да, ширина и высота этого блока постоянны 100 от 4s до 6s plus. Для ipad это значение должно быть изменено на 150.

Ответ №1:

IB не очень изящно справляется с этим. Самое сложное решение — добавить «разделительные» виды (виды, которые мы добавим для разделения в автозапуске, но которые будут невидимыми). Просто сделайте ширину разделительных видов равной, а затем либо поместите эти пять видов в стековый вид, либо просто установите горизонтальные ограничения, чтобы пять видов примыкали друг к другу:

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

Затем просто установите для фона разделительных видов чистый цвет, чтобы мы их не видели, и у вас будет нужный интервал:

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


Если вы делаете это программно (чего, я знаю, вы не делаете, но просто для полноты картины), вы бы использовали UILayoutGuide вместо этих невидимых разделительных представлений:

 let view1 = ...
let view2 = ...

let layout1 = UILayoutGuide()
view.addLayoutGuide(layout1)
let layout2 = UILayoutGuide()
view.addLayoutGuide(layout2)
let layout3 = UILayoutGuide()
view.addLayoutGuide(layout3)

let views: [String: Any] = ["view1": view1, "view2": view2, "layout1": layout1, "layout2": layout2, "layout3": layout3]

view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[layout1][view1(==100)][layout2(==layout1)][view2(==100)][layout3(==layout1)]|", options: .alignAllCenterX, metrics: nil, views: views))

view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[view1(==100)]", options: [], metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[view2(==100)]", options: [], metrics: nil, views: views))
 

Несколько удивительно, что Apple до сих пор не добавила руководства по компоновке в IB.

Комментарии:

1. Большое спасибо, Роб. Я использовал решение для просмотра с разделителем.