Как анимировать кнопки, чтобы выходить за границы видимости - PullRequest
0 голосов
/ 27 декабря 2018

На домашнем экране у меня есть ряд кнопок, которые выровнены по центру: новая игра, как играть, продолжить игру.

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

Align Center X to: Safe Area
Align Center Y to: Safe Area, Multiplier 1.2
Proportional width 0.6 with Superview
300:50 Ratio: to Button

Я думал, что следующий код обеспечит желаемую анимацию, но не работает:

 button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 1000)
            UIView.animate(withDuration: 1, delay: 1, usingSpringWithDamping: 4, initialSpringVelocity: 4, options: .curveEaseOut, animations: { self.view.layoutIfNeeded()}, completion: nil)

Любые предложения о том, как заставить кнопку анимироваться так, чтобы она перемещалась вбок от экрана, очень ценятся!

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Вот как я это делаю.Не имеет всех ваших дополнительных упругих параметров, но, возможно, это полезно:

amountToTranslateBy = self.view.bounds.width // assuming this is executed from inside ViewController

UIView.animate(withDuration: yourDuration, delay: yourDelay, options: .curveEaseOut, animations: {

                        for view in yourArrayOfViews {
                            view.center.x -= amountToTranslateBy
                        }

                    }, completion: nil)

Установленные вами ограничения не должны быть затронуты этой анимацией, тем более что ограничения кнопок зависят от других (супер) просмотров не наоборот.Если вы помните, переместите представления обратно на их первоначальное место (+ = amountToTranslateBy), используя ту же методологию в соответствующее время, все должно быть в порядке.

0 голосов
/ 27 декабря 2018

Просто это

button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 1000)

создаст другое ограничение и вызовет конфликт, поэтому, когда вы создаете оригинальный centerX, держите его в переменной вроде

var centerCon:NSLayoutConstraint! 
centerCon = button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 0) 
centerCon.isActive = true

Затем поиграйте сэто постоянное значение

 centerCon.constant =  1000
 UIView.animate(withDuration: 1, delay: 1, usingSpringWithDamping: 4, initialSpringVelocity: 4, options: .curveEaseOut, animations: { self.view.layoutIfNeeded()}, completion: nil)
...