Держать UIView прикрепленным к верхней части экрана при изменении высоты и анимации? - PullRequest
1 голос
/ 11 октября 2019

У меня есть приложение с контроллером панели вкладок и двумя контроллерами представления. Один из этих контроллеров представления содержит карту, которая изначально ограничена руководством по разметке безопасной области вверху и внизу экрана. Когда я нажимаю на кнопку (которую вы можете увидеть в верхнем левом углу на снимке экрана ниже), я хочу уменьшить (и анимировать) высоту карты, чтобы добавить новый вид под ней.

Вот код, который я сейчас использую:

class MapViewController: UIViewController {

    private var mapView = MGLMapView()
    private var button = UIButton()
    private var heightConstraint: NSLayoutConstraint!    
    private var mapCollapsed: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        setupView()

        NSLayoutConstraint.activate([
            mapView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            mapView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])

        let mapViewTopConstraint = NSLayoutConstraint(item: mapView, attribute: .top, relatedBy: .equal, toItem: view.safeAreaLayoutGuide, attribute: .top, multiplier: 1.0, constant: 0)
        mapViewTopConstraint.isActive = true

        heightConstraint = NSLayoutConstraint(item: mapView, attribute: .bottom, relatedBy: .equal, toItem: view.safeAreaLayoutGuide, attribute: .bottom, multiplier: 1.0, constant: 0)
        heightConstraint.isActive = true

        setupButton()
    }

    private func setupView() {
        mapView.translatesAutoresizingMaskIntoConstraints = false
        mapView.styleURL = URL(string: "STYLE_URL_HERE")!
        view.addSubview(mapView)
    }

    @objc func updateConstraintsButtonTapped(sender: UIButton!) {
        if mapCollapsed == false {
            mapCollapsed = true
            view.layoutIfNeeded()
            UIView.animate(withDuration: 0.33, delay: 0.0, options: [.curveEaseOut], animations: {
                self.heightConstraint.constant = -150
                self.view.layoutIfNeeded()
            })
        } else {
            mapCollapsed = false
            view.layoutIfNeeded()
            UIView.animate(withDuration: 0.33, delay: 0.0, options: [.curveEaseOut], animations: {
                self.heightConstraint.constant = 0
                self.view.layoutIfNeeded()
            })
        }
}

По большей части это выглядит так, как я ожидал, но, как вы можете видеть на анимированном GIF ниже, когда я нажимаю кнопку иВызовите updateConstraintsButtonTapped(sender:), вид карты изменяется, но при этом весь вид карты скользит (быстро) вниз от верхней части экрана, а затем скользит вверх и изменяет размеры. Мне бы хотелось, чтобы верхняя часть карты была прикреплена к руководству по компоновке безопасной области и видела только движение нижней части вида карты при изменении размера. Я явно что-то делаю неправильно. Я попытался установить приоритет на mapViewTopConstraint равным 1000, думая, что это может помочь, но, к сожалению, это не имело значения. Может кто-нибудь объяснить мне, что я делаю не так?

enter image description here

...