У меня есть приложение с контроллером панели вкладок и двумя контроллерами представления. Один из этих контроллеров представления содержит карту, которая изначально ограничена руководством по разметке безопасной области вверху и внизу экрана. Когда я нажимаю на кнопку (которую вы можете увидеть в верхнем левом углу на снимке экрана ниже), я хочу уменьшить (и анимировать) высоту карты, чтобы добавить новый вид под ней.
Вот код, который я сейчас использую:
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, думая, что это может помочь, но, к сожалению, это не имело значения. Может кто-нибудь объяснить мне, что я делаю не так?