Ограничение для установки максимальной высоты для элементов внутри stackView - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть stackView с блоками UiViews внутри, как вы можете видеть на картинке. Я хотел бы установить максимальную высоту 50 или меньше для ящиков внутри, поскольку они выглядят слишком большими прямо сейчас, но я также хотел бы сохранить соотношение 1: 1, чтобы они были квадратными. Я пытался установить ограничение высоты для stackView, но когда я это делаю, соотношение сторон 1: 1 игнорируется.

Вот как это выглядит сейчас:

enter image description here

И вот код:

let stackview = UIStackView(arrangedSubviews: letterBoxes)
        stackview.axis = .horizontal
        stackview.spacing = 5
        stackview.distribution = .fillEqually
        stackview.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(stackview)        
        NSLayoutConstraint.activate([
            stackview.topAnchor.constraint(equalTo: secondLine.bottomAnchor, constant: c/2 +
                20),
            stackview.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            stackview.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10)
            ])

        for box in letterBoxes{
            box.aspectRation(1.0/1.0).isActive = true
        }

Редактировать: Я хочу, чтобы окно автоматически изменяло размер и не переполнялось, как показано ниже (каждый раз, когда количество ящиков различно. поэтому, например, когда есть только 3 ящика, я хочу, чтобы максимальный размер был 50, но когда число 6 или больше, я хочу, чтобы оно автоматически меняло размеры, чтобы оно соответствовало экрану и не переполняется. Как только я снимаю ведущее ограничение, оно переполняется): enter image description here

1 Ответ

1 голос
/ 13 апреля 2020

Следующее выполнит работу.

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let letterBoxes = [UIView(), UIView(), UIView()]
        for box in letterBoxes {
            box.translatesAutoresizingMaskIntoConstraints = false
            box.backgroundColor = .systemBlue
            view.addSubview(box)

            let heightConstraint = box.heightAnchor
                .constraint(equalToConstant: 50)
            heightConstraint.priority = .defaultHigh

            NSLayoutConstraint.activate([
                box.widthAnchor.constraint(equalTo: box.heightAnchor),
                heightConstraint
            ])
        }

        let stackview = UIStackView(arrangedSubviews: letterBoxes)
        stackview.axis = .horizontal
        stackview.spacing = 5
        stackview.distribution = .fillEqually
        stackview.alignment = .center
        stackview.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stackview)

        NSLayoutConstraint.activate([
            stackview.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            stackview.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            stackview.leadingAnchor.constraint(
                greaterThanOrEqualTo: view.leadingAnchor,
                constant: 10
            ),
            stackview.trailingAnchor.constraint(
                lessThanOrEqualTo: view.trailingAnchor,
                constant: -10
            )
        ])
    }
}

Смысл в том, чтобы приоритеты heighConstraint s для ящиков были меньше required. Поэтому, когда ящиков не так много, они будут иметь размер 50, но когда их много, ограничения по высоте будут игнорироваться.

Также обратите внимание, что stackview 'leadingAnchor и Ограничение trailingAnchor сохраняет поля в границах экрана.

На следующих снимках экрана показан результат:

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...