Изменение размера ограничений для UIView. быстрый - PullRequest
1 голос
/ 23 января 2020

У меня есть два пользовательских UIViews на экране. UIViewOne занимает 75% экрана, а UIViewTwo 25%. Мне нужно нажать на UIViewTwo, изменить его размер, чтобы сделать второй больше и меньше первым. Я также знаю, что это должно быть сделано с использованием ограничений, но я не знаю как. Подскажите пожалуйста как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 23 января 2020

Для view1 и view2:

  1. добавить ограничение как равную высоту для суперпредставления
  2. обновить множитель ограничения высоты до 0,75 для view1 и 0.25 для view2.

Когда вы нажимаете на view2, аналогичным образом обновите множитель ограничения высоты до 0.25 для view1 и 0.75 для view2.

1 голос
/ 23 января 2020

Один из подходов - добавить два ограничения высоты к view1 и изменить их Приоритет ,

  • добавить ограничение высоты на 75% (multiplier = 0.75)
  • установить его приоритет на 999
  • добавить ограничение высоты на 25% (multiplier = 0.25)
  • установить его приоритет на 998
  • ограничивает верхнюю часть view2 до нижней части view1.

В начале ограничение высоты 75% будет иметь приоритет над ограничением 25% ... 999 больше 998. При нажатии view2 измените приоритет ограничения 75% на 997. Теперь 997 меньше 998, поэтому ограничение 25% получает приоритет.

Так как вершина view2 ограничена низом view1, view2 автоматически изменит размер.

Вот пример, который вы можете запустить как есть (просто назначьте его контроллеру вида ... нет необходимости в IBOutlet или IBAction соединениях):

class PercentViewController: UIViewController {

    let view1: UIView = {
        let v = UIView()
        v.backgroundColor = .red
        return v
    }()

    let view2: UIView = {
        let v = UIView()
        v.backgroundColor = .green
        return v
    }()

    var topView75: NSLayoutConstraint!
    var topView25: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        // we're using auto-layout
        view1.translatesAutoresizingMaskIntoConstraints = false
        view2.translatesAutoresizingMaskIntoConstraints = false

        // add views
        view.addSubview(view1)
        view.addSubview(view2)

        // respect safe area
        let g = view.safeAreaLayoutGuide

        // create "75% height constraint"
        topView75 = view1.heightAnchor.constraint(equalTo: g.heightAnchor, multiplier: 0.75)
        // create "25% height constraint"
        topView25 = view1.heightAnchor.constraint(equalTo: g.heightAnchor, multiplier: 0.25)

        // give 75% constraint higher priority than 25% constraint
        topView75.priority = UILayoutPriority(rawValue: 999)
        topView25.priority = UILayoutPriority(rawValue: 998)

        NSLayoutConstraint.activate([

            // view1 constrained Top, Leading, Trailing (to safe-area)
            view1.topAnchor.constraint(equalTo: g.topAnchor),
            view1.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            view1.trailingAnchor.constraint(equalTo: g.trailingAnchor),

            // view2 constrained Bottom, Leading, Trailing (to safe-area)
            view2.bottomAnchor.constraint(equalTo: g.bottomAnchor),
            view2.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            view2.trailingAnchor.constraint(equalTo: g.trailingAnchor),

            // view2 Top constrained to view1 Bottom
            view2.topAnchor.constraint(equalTo: view1.bottomAnchor),

            // activate both Height constraints
            topView75,
            topView25,

        ])

        // create tap gesture recognizers
        let tap1 = UITapGestureRecognizer(target: self, action: #selector(view1Tapped(_:)))
        let tap2 = UITapGestureRecognizer(target: self, action: #selector(view2Tapped(_:)))

        // add to the views
        view1.addGestureRecognizer(tap1)
        view2.addGestureRecognizer(tap2)

    }

    @objc func view1Tapped(_ sender: Any) -> Void {
        // view1 tapped, so give 75% constraint a higher priority than 25% constraint
        topView75.priority = UILayoutPriority(rawValue: 999)
        // 0.3-second animation
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
    }

    @objc func view2Tapped(_ sender: Any) -> Void {
        // view2 tapped, so give 25% constraint a higher priority than 75% constraint
        topView75.priority = UILayoutPriority(rawValue: 997)
        // 0.3-second animation
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
    }

}
...