Ограничения программно не работают так же, как ограничения в раскадровке - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь использовать автоматическую разметку программно, чтобы мой настраиваемый вид изменял свой размер при изменении границ.Чего я пытаюсь достичь:
1) сделать изображение как можно большим на экране, но сохраняйте соотношение сторон между его высотой и размером 8/5
2) никогда не выходите за пределы безопасной зоны
3) всегда оставаться посередине
Когда я использую этот набор ограничений в раскадровке, все работает отлично, но когда я делаю то же самое в коде, xcode нарушает мое ограничение высоты (которое я использую для соотношения сторон для представления).Я играл с приоритетами, но безуспешно.Что я делаю неправильно?Вот мой код и скриншот моих ограничений раскадровки:

скриншот ограничений раскадровки

private func setupLayout () {

    playingCardView.translatesAutoresizingMaskIntoConstraints = false

    //makes the maxim width possible
    let playingCardViewWidthConstraint = playingCardView.widthAnchor.constraint(equalToConstant: 800)
    playingCardViewWidthConstraint.priority = UILayoutPriority(rawValue: 250)
    playingCardViewWidthConstraint.identifier = "width"

    //for aspect ratio
    let playingCardViewHeightConstraint = playingCardView.heightAnchor.constraint(equalTo: playingCardView.widthAnchor, multiplier: 8.0/5.0)
    playingCardViewHeightConstraint.identifier = "height"

    //make the view stay within bounds
    //add some padding top
    let playingCardTopConstraint = playingCardView.topAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.topAnchor, constant: Constants.offsetFromTheEdge)

    //add some padding bottom
    let plaingCardViewBottomConstraint = playingCardView.bottomAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: Constants.offsetFromTheEdge)

    //add some padding leading
    let playingCardViewLeadingConstraint = playingCardView.leadingAnchor.constraint(lessThanOrEqualTo: view.layoutMarginsGuide.leadingAnchor, constant: Constants.offsetFromTheEdge)

    ////add some padding trailing
    let playingCardViewTrailingConstraint = playingCardView.trailingAnchor.constraint(lessThanOrEqualTo: view.layoutMarginsGuide.trailingAnchor, constant: Constants.offsetFromTheEdge)

    NSLayoutConstraint.activate([
        playingCardViewWidthConstraint,
        playingCardViewHeightConstraint,
        playingCardView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        playingCardView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        playingCardTopConstraint,
        playingCardViewBottomConstraint,
        playingCardViewLeadingConstraint,
        playingCardViewTrailingConstraint
            ])
    }
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

В опубликованном вами коде ...

Вы пропускаете y в let plaingCardViewBottomConstraint = ...

Кроме этого, вы устанавливаете ограничения Top и Bottom на view.safeAreaLayoutGuide, новы устанавливаете ограничения Leading и Trailing на layoutMarginsGuide.

Измените view.layoutMarginsGuide на view.safeAreaLayoutGuide, и у вас должно получиться то, что вы ожидаете.

0 голосов
/ 20 октября 2018

Когда речь идет об ограничениях, вам нужно подумать о 4 вещах

x => ведущий / тянущийся / левый / правый / centerX

y => top, bottom, centerY

ширина => статическая / пропорциональная

высота => статическая / пропорциональная

Я думаю, что здесь вы запускаете все возможные конфликты, независимо от приоритетов

вы даетеширина ширины 800 и задает передний && трейлинг, который, конечно, меньше, чем, Как вы?

вы даете высоту пропорции вида и зацепляете его сверху и снизу, как сделать ??

вы задаете начальные и конечные значения и задаете centerX, Зачем ??

вы задаете верх и низ и задаете centerY, Зачем ??

Не добавляйте ограничениеесли это не добавит никакого значения

...