缩放和移动UIView的动画(swift) 我有一个UIVIEW,放在屏幕中间。当用户按下按钮时,我希望它在屏幕顶部附近向上移动,因为它缩小到大约五分之一的大小

缩放和移动UIView的动画(swift) 我有一个UIVIEW,放在屏幕中间。当用户按下按钮时,我希望它在屏幕顶部附近向上移动,因为它缩小到大约五分之一的大小,swift,animation,uiview,Swift,Animation,Uiview,我试过这个: UIView.animateWithDuration(0.7) { () -> Void in self.main.transform = CGAffineTransformMakeScale(0.2, 0.2) self.main.transform = CGAffineTransformMakeTranslation(0, -250) } 但出于某种原因,这只会扩展视图。我还尝试将其放入动画的持续时间中:

我试过这个:

UIView.animateWithDuration(0.7) { () -> Void in
            self.main.transform = CGAffineTransformMakeScale(0.2, 0.2)
            self.main.transform = CGAffineTransformMakeTranslation(0, -250)
        }
但出于某种原因,这只会扩展视图。我还尝试将其放入动画的持续时间中:

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

如何使这两个动画都工作?

您可以在Swift中以多种方式实现基本
UIView动画。下面的代码只是一个简单的方法

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)})

      }
     } 
输出:


乔的回答与他的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
    })
}

你好我已经这样做了,但是在做了这个之后,图像视图缩小了animation@Md.Sulayman这就是动画后收缩视图的全部思想。再读一遍这篇文章。让我知道你们想要实现什么?但我的图像纵横比在动画制作后丢失了,收缩不是问题,我想要那个too@Md.Sulayman这可能是另一个问题…检查您的约束条件?我的场景是,我在动画之前禁用了所有constarint,同时添加了缩放和平移。实际上,我同时需要这两个选项“let originalTransform=self.idImageView.transform let scaledTransform=originalTransform.scaledBy(x:WidthOfimimage/displayWidth,y:HeightOfimimage/displayHeight)let scaledTransform=scaledTransform.translatedBy(x:200,y:-1000)self.idImageView.transform=scaledAndTranslatedTransformormThanks为解决方案提供了帮助。但是,翻译会相对移动我的视图。我如何移动它以固定屏幕坐标,如x=100 y=100位置???。我意识到翻译后的视图会相对当前位置移动你的位置。@Md.Sulayman你需要计算y和y之间的差值我们的目的地x和y坐标以及UIView的坐标,然后将UIView的坐标转换为该数量。如果您想查看代码示例,请随时打开另一个问题并在此处链接我:)