Swift- UIView動(dòng)畫實(shí)踐

在iOS中,實(shí)現(xiàn)動(dòng)畫有兩種方法。一個(gè)是統(tǒng)一的animateWithDuration,另一個(gè)是組合出現(xiàn)的beginAnimations和commitAnimations。這三個(gè)方法都是類方法。

使用animateWithDuration來(lái)實(shí)現(xiàn)動(dòng)畫

此方法共有5個(gè)參數(shù):

  • duration:動(dòng)畫從開(kāi)始到結(jié)束的持續(xù)時(shí)間,單位是秒
  • delay:動(dòng)畫開(kāi)始前等待的時(shí)間
  • options:動(dòng)畫執(zhí)行的選項(xiàng)。里面可以設(shè)置動(dòng)畫的效果??梢允褂肬IViewAnimationOptions類提供的各種預(yù)置效果
  • anmations:動(dòng)畫效果的代碼塊
  • completion:動(dòng)畫執(zhí)行完畢后執(zhí)行的代碼塊

UIView支持動(dòng)畫效果的屬性

  • frame:此屬性包含一個(gè)矩形,即邊框矩形,此值確定了當(dāng)前視圖在其父視圖坐標(biāo)系中的位置與尺寸
  • bounds:也是矩形,邊界矩形,它指的是視圖在其自己的坐標(biāo)系中的位置和尺寸,左上角坐標(biāo)永遠(yuǎn)是(0,0)
  • center:確定視圖的中心點(diǎn)在其父視圖坐標(biāo)系中的位置坐標(biāo)。即定義當(dāng)前視圖在父視圖中的位置
  • alpha:視圖的透明度。(但視圖完全透明時(shí),不能響應(yīng)觸摸消息)
  • backgroundColor:背景色
  • transform:這是一種3×3的變化矩陣。通過(guò)這個(gè)矩陣我們可以對(duì)一個(gè)坐標(biāo)系統(tǒng)進(jìn)行縮放、平移、旋轉(zhuǎn)以及這兩者的任意組操作。

Transform(變化矩陣)的四個(gè)常用的變換方法

  • CGAffineTransformMake():返回變換矩陣
  • CGAffineTransformMakeTranslation():返回平移變換矩陣
  • CGAffineTransformMakeScale():返回縮放變換矩陣
  • CGAffineTransformMakeRotation():返回旋轉(zhuǎn)變換矩陣

樣例1:方塊初始縮小為原始尺寸1/10。在1秒的動(dòng)畫中復(fù)原到完整大小,同時(shí)還伴隨旋轉(zhuǎn)效果。

import UIKit

class ViewController: UIViewController {
    
    var dimension:Int = 4       // 游戲方格維度
    var width:CGFloat = 50      // 數(shù)字格子的寬度
    var padding:CGFloat = 6     // 格子與格子的間距
    var backgrounds:Array<UIView>!      // 保存背景圖數(shù)據(jù)

    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.backgrounds = Array<UIView>()
        setupGameMap()
        playAnimation()

    }
    
    func setupGameMap() {
        var x:CGFloat = 50
        var y:CGFloat = 150
        
        for i in 0..<dimension {
            print(i)
            y = 150
            for _ in 0..<dimension {
                // 初始化視圖
                let background = UIView(frame:CGRectMake(x, y, width, width))
                background.backgroundColor = UIColor.darkGrayColor()
                self.view.addSubview(background)
                
                // 將視圖保存起來(lái),以備后用
                backgrounds.append(background)
                y += padding + width
            }
            x += padding+width
        }
    }
    
    func playAnimation() {
        for tile in backgrounds {
            // 先將數(shù)字塊大小置為原始尺寸的 1/10
            tile.layer.setAffineTransform(CGAffineTransformMakeScale(0.1,0.1))

            // 設(shè)置動(dòng)畫效果,動(dòng)畫時(shí)間長(zhǎng)度1 秒.
            UIView.animateWithDuration(1, delay:0.01,
                                       options:UIViewAnimationOptions.TransitionNone, animations:
                {
                    ()-> Void in
                    // 在動(dòng)畫中,數(shù)字塊有一個(gè)角度的旋轉(zhuǎn)
                    tile.layer.setAffineTransform(CGAffineTransformMakeRotation(90))
                },
                                       completion:{
                                        (finished:Bool) -> Void in
                                        UIView.animateWithDuration(1, animations:{
                                            ()-> Void in
                                            // 完成動(dòng)畫時(shí),數(shù)字塊復(fù)原
                                            tile.layer.setAffineTransform(CGAffineTransformIdentity)
                                        })
            })
        }
    }
  
}

樣例2:只有從小變大的效果

func playAnimation() {
        for tile in backgrounds{
            // 先將數(shù)字塊大小置為原始尺寸的1/10
            tile.layer.setAffineTransform(CGAffineTransformMakeScale(0.1,0.1))
            
            // 設(shè)置動(dòng)畫效果,動(dòng)畫時(shí)間長(zhǎng)度 1 秒.
            UIView.animateWithDuration(1, delay:0.01,
                                       options:UIViewAnimationOptions.TransitionNone, animations:
                {
                    ()-> Void in
                    tile.layer.setAffineTransform(CGAffineTransformMakeScale(1,1))
                },
                                       completion:{
                                        (finished:Bool) -> Void in
                                        UIView.animateWithDuration(0.08, animations:{
                                            ()-> Void in
                                            tile.layer.setAffineTransform(CGAffineTransformIdentity)
                                        })
            })
        }
    }

樣例3:方塊從不透明到透明的效果

func playAnimation() {
        for tile in backgrounds{
            tile.alpha = 0;
            
            // 設(shè)置動(dòng)畫效果,動(dòng)畫時(shí)間長(zhǎng)度 1 秒。
            UIView.animateWithDuration(1, delay:0.01,
                                       options:UIViewAnimationOptions.CurveEaseInOut, animations:
                {
                    ()-> Void in
                },
                                       completion:{
                                        (finished:Bool) -> Void in
                                        UIView.animateWithDuration(1, animations:{
                                            ()-> Void in
                                            tile.alpha = 1
                                        })
            })
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容