在 Swift 中平滑扩展 UIView 动画

Posted

技术标签:

【中文标题】在 Swift 中平滑扩展 UIView 动画【英文标题】:Smooth expanding UIView animation in Swift 【发布时间】:2017-07-05 07:05:03 【问题描述】:

目标:

如何为我想要展开以填满整个屏幕的UIView 设置动画。 UIView 需要在动画时以平滑、均匀和平衡的方式展开。

我在屏幕上放置了一个红色方块,从小开始,然后扩展以适应屏幕。 (图 1。)

let subview = UIView()
subview.backgroundColor = .red
subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
self.view.addSubview(subview)

问题:

在 Swift 2 和 Swift 3 中,使用 animateWithDuration,我该怎么做 动画红色方块UIView 以平衡且均匀的方式扩展 以四面八方的方式填满整个屏幕?

UIView.animateWithDuration(1.0, delay: 0, options: nil, animations: 

    ?????

, completion: nil)

图片 1:

【问题讨论】:

【参考方案1】:

你可以试试这个,我将持续时间设置为 5 秒,但你明白了。

let viewWidth = view.frame.width
let viewHeight = view.frame.height
UIView.animate(withDuration: 5)  
    subview.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)

【讨论】:

这很简单。谢谢。【参考方案2】:

看起来你需要玩规模。

class ViewController: UIViewController 

var subview:UIView!

@IBOutlet weak var animateButton:UIButton!

override func viewDidLoad() 
    super.viewDidLoad()
    subview = UIView()
    subview.backgroundColor = .red
    subview.frame = CGRect(x: 60, y: 200, width: 50, height: 50)
    self.view.addSubview(subview)

    self.view.bringSubview(toFront: animateButton)


@IBAction func animateButtonPressed(sender:UIButton) 
    if(sender.tag == 0) 

        let screenCenter = CGPoint(x:UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY)
        let subviewCenter = self.view.convert(self.subview.center, to: self.view)
        let offset = UIOffset(horizontal: screenCenter.x-subviewCenter.x, vertical: screenCenter.y-subviewCenter.y)

        let widthScale = UIScreen.main.bounds.size.width/subview.frame.size.width
        let heightScale = UIScreen.main.bounds.size.height/subview.frame.size.height
        UIView.animate(withDuration: 1.0, animations: 
            let scaleTransform = CGAffineTransform(scaleX: widthScale, y: heightScale)
            let translateTransform = CGAffineTransform(translationX: offset.horizontal, y: offset.vertical)
            self.subview.transform = scaleTransform.concatenating(translateTransform)
        , completion:  (finished) in
            sender.tag = 1;
        )

     else 
        UIView.animate(withDuration: 1.0, animations: 
            self.subview.transform = CGAffineTransform.identity
        , completion:  (finished) in
            sender.tag = 0;
        )
    


【讨论】:

感谢您的建议。

以上是关于在 Swift 中平滑扩展 UIView 动画的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Core Animation 中平滑更新动画的 toValue/end 点?

无法在iOS 11 Swift中平滑地展开文本视图

Swift:沿动画路径动画对象

Three.js在函数中平滑旋转一个对象

UIView 动画在第一次尝试时没有动画

按下按钮时 UITableView 标题视图的动画显示(swift)