Подтвердить что ты не робот

Анимация для масштабирования и перемещения UIView (быстрый)

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

Я пробовал это:

UIView.animateWithDuration(0.7) { () -> Void in
            self.main.transform = CGAffineTransformMakeScale(0.2, 0.2)
            self.main.transform = CGAffineTransformMakeTranslation(0, -250)
        }

Но по какой-то причине это только масштабирует представление. Я также попытался поместить это в animateWithDuration:

self.main.frame = CGRectMake(self.view.frame.width/2 - 10, 50, 50, 50)

Как я могу заставить обе анимации работать?

4b9b3361

Ответ 1

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

@IBAction func animateButton(_ sender: UIButton) {
    let originalTransform = self.main.transform
    let scaledTransform = originalTransform.scaledBy(x: 0.2, y: 0.2)
    let scaledAndTranslatedTransform = scaledTransform.translatedBy(x: 0.0, y: -250.0)
    UIView.animate(withDuration: 0.7, animations: {
        self.main.transform = scaledAndTranslatedTransform
    })
}

Ответ 2

Вы можете достичь базового UIView animation несколькими способами в Swift. Ниже код - это простой подход...

class ViewController: UIViewController {

@IBOutlet weak var animationButton: UIButton!
@IBOutlet weak var myView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()
    // I added seperate colour to UIView when animation move from one animation block to another.So, You can get better understanding how the sequence of animation works.
  self.myView.backgroundColor = .red
}

@IBAction func animateButton(_ sender: UIButton) {

    UIView.animate(withDuration: 0.5, delay: 0.0, options: UIViewAnimationOptions.curveEaseIn, animations: { 
        //Frame Option 1:
        self.myView.frame = CGRect(x: self.myView.frame.origin.x, y: 20, width: self.myView.frame.width, height: self.myView.frame.height)

        //Frame Option 2:
        //self.myView.center = CGPoint(x: self.view.frame.width / 2, y: self.view.frame.height / 4)
        self.myView.backgroundColor = .blue

        },completion: { finish in

    UIView.animate(withDuration: 1, delay: 0.25,options: UIViewAnimationOptions.curveEaseOut,animations: {
        self.myView.backgroundColor = .orange      
        self.myView.transform = CGAffineTransform(scaleX: 0.25, y: 0.25)

        self.animationButton.isEnabled = false // If you want to restrict the button not to repeat animation..You can enable by setting into true

        },completion: nil)})

      }
     } 

Вывод:

введите описание изображения здесь