以编程方式创建自定义视图,然后为其设置动画

时间:2017-06-05 19:23:56

标签: ios swift uiview transform uianimation

我以编程方式创建自定义视图,工作正常,然后我尝试为视图设置动画。由于一些奇怪的原因,视图完全是动画,我不知道为什么。这是代码:

  override func viewDidLoad() {
    super.viewDidLoad()


    let customView = UIView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))

    customView.backgroundColor = UIColor.blue
    customView.layer.cornerRadius = 25
    customView.layer.borderWidth = 8
    customView.layer.borderColor = UIColor.red.cgColor

    self.view.addSubview(customView)

    UIView.animate(withDuration: 4, animations: {

      customView.transform.translatedBy(x: 40, y: 60)
      customView.transform.rotated(by: CGFloat.pi/2)
      customView.transform.scaledBy(x: 0, y: 0.5)

    })
  }

2 个答案:

答案 0 :(得分:1)

你最好在viewDidAppear中调用这个动画块,但有一些延迟。

import UIKit

class ViewController: UIViewController {

    var customView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        customView = UIView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
        customView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

        customView.backgroundColor = UIColor.blue
        customView.layer.cornerRadius = 25
        customView.layer.borderWidth = 8
        customView.layer.borderColor = UIColor.red.cgColor

        self.view.addSubview(customView)
    }

    override func viewDidAppear(_ animated: Bool) {
        UIView.animate(withDuration: 5, delay: 1, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
          self.customView.transform = CGAffineTransform(scaleX: 1, y: 0.5)
          self.customView.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2)
          self.customView.transform = CGAffineTransform(translationX: 40, y: 60)
        }, completion: nil)
    }

    func handleTap() {
        UIView.animate(withDuration: 5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            self.customView.transform = CGAffineTransform(scaleX: 1, y: 0.5)
            self.customView.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2)
            self.customView.transform = CGAffineTransform(translationX: 40, y: 60)
        }, completion: nil)
    }

}

答案 1 :(得分:0)

你的问题不正确。你的观点不是动画。

<强>为什么吗

您正在使用返回函数,而您的customView需要捕获这样的修改版本。

customView.transform =  customView.transform.translatedBy(x: 40, y: 60)

所以你的代码就是这样。

让customView = UIView(框架:CGRect(x:10,y:10,宽度:100,高度:100))

    customView.backgroundColor = UIColor.blue
    customView.layer.cornerRadius = 25
    customView.layer.borderWidth = 8
    customView.layer.borderColor = UIColor.red.cgColor

    self.view.addSubview(customView)

    UIView.animate(withDuration: 4, animations: {

       customView.transform =  customView.transform.translatedBy(x: 40, y: 60)
       //customView.transform = customView.transform.rotated(by: CGFloat.pi/2)
       //customView.transform = customView.transform.scaledBy(x: 0, y: 0.5)

    })

有很多在线资源如何分组动画。只是google it。:)