как заставить кнопки в stackview изменять размер в зависимости от размера экрана (с помощью main.раскадровки или кода)

#ios #swift #xcode #autolayout #storyboard

Вопрос:

Я пытаюсь понять, как сделать так, чтобы мои три кнопки в стеке имели относительный размер и сохраняли одинаковое расстояние между множителями на разных устройствах, например, кнопки будут больше, если я нахожусь на ipad по сравнению с iphone. Во-вторых, расстояние между левым и правым краями кнопок на ipad будет больше, чем на устройстве iphone. До сих пор у меня в настоящее время есть три кнопки в стеке. Я добавил горизонтальное и вертикальное выравнивание в свой stackview. Я поиграл с добавлением равных высот и ширины и изменил множитель, а также добавил ограничения к кнопкам, однако это не дало желаемого результата. Вот скриншот того, как я хотел бы, чтобы мои товары размещались на всех устройствах:

снимок экрана.

Ответ №1:

UIStackView имеет только статический интервал. У вас есть два варианта:

  1. Измените интервал внутри кода с viewWillLayoutSubviews помощью . Я предпочитаю это viewDidLayoutSubviews , потому что изменения будут следовать за анимацией вращения. Но если ваши расчеты будут зависеть от других подвидов(не только self.view ), эти кадры еще не будут обновлены. Ты тоже можешь constraint.constant так измениться.
 @IBOutlet var stackView: UIStackView!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    stackView.spacing = view.bounds.height * 0.05
}
 
  1. Используя только раскадровку, вы не можете добавить ограничение расстояния с помощью модификатора. Но вы можете добавить прозрачный вид, который будет вашим разделителем, и применить к нему модификатор ширины/высоты. Это можно использовать как для UIStackView простых представлений, так и для простых представлений.

Я предпочитаю добавлять ограничение равной высоты для всех видов с одинаковым размером(например btn1.height = btn2.height, btn1.height = btn3.height ), поэтому я могу установить размер с одним ограничением для всех из них( btn1.height = superview.height * 0.1 ).

Что — то подобное должно сработать для вашего:

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

Результат:

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