как изменить приоритет offset () и multipliedBy () в snapkit - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу сделать размер UIView: height = (width - 100) * 0.5, поэтому код такой:

view.snp.makeConstraints {
  $0.top.left.right.equalTo(0)
  $0.height.equalTo(view.snp.width).offset(-100).multipliedBy(0.5)
}

но результат высоты равен width * 0.5 - 100,

как изменить приоритет offset() и multipliedBy()?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Как вы обнаружили, в автоматическом макете сначала применяется множитель , а затем константа .

Из документов Apple:

enter image description here

Для достижения sh вашей цели вам нужно использовать другой вид или, что лучше, UILayoutGuide.

Скажите автоматическому макету, что вы хотите, чтобы otherView / layoutGuide был viewWidth - 100, а затем вы хотите, чтобы представление было этим значением * 0.5.

Вот пример :

class SnapTestViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // create a view
        let testView = UIView()
        testView.backgroundColor = .orange

        // create a Layout Guide
        let vGuide = UILayoutGuide()

        // add the layout guide to the testView
        testView.addLayoutGuide(vGuide)

        // constrain the layout guide
        vGuide.snp.makeConstraints {
            // to bottom-left corner
            $0.leading.bottom.equalToSuperview()
            // height doesn't really matter (it's not visible)
            $0.height.equalTo(1)
            // width = superView (testView) width - 100
            $0.width.equalToSuperview().offset(-100)
        }

        // add testView to self.view
        view.addSubview(testView)

        // constrain testView
        testView.snp.makeConstraints {
            // 40-pts leading and trailing
            $0.leading.trailing.equalToSuperview().inset(40)
            // 100-pts from the top
            $0.top.equalToSuperview().offset(100)
            // height = layoutGuide height * 0.5
            $0.height.equalTo(vGuide.snp.width).multipliedBy(0.5)
        }

    }

}
0 голосов
/ 16 апреля 2020

Я думаю, что если вы хотите, чтобы в вашем описании было height = (width - 100) * 0.5, тогда ваш код должен измениться на что-то вроде: -

    view.snp.makeConstraints {
        $0.top.left.right.equalTo(8)
        let calculatedHeight:CGFloat = (view.bounds.width - 100) * 0.5
        $0.height.equalTo(calculatedHeight).priority(.required)
    }

И вы можете изменить приоритет, используя Enstra SnapKit ConstraintPriority, как объяснено на официальном документация проверьте приведенный выше пример кода.

...