#12 在iOS App播放動畫- 利用UIImageView、陣列array
Published in
8 min readAug 5, 2020
利用 UIImageView 及array實現多張圖片連續播放的動畫
GIF動畫其實是由很多張連續動作的圖片組成的,在iOS App中無法直接播放GIF,但透過UIImageView就可以做出多張圖片播放的動畫效果。
操作步驟:1. 網路下載GIF或自己製作動畫圖片。2. 將GIF轉成多張圖片,在xcode中,只能使用JPG及PNG的圖片。3. 將圖片們加入Assets.xcassets。4. 在ViewController.swift裡的func viewDidLoad裡設定image view播放動畫。
實際操作:
1. GIF轉檔並加入xcode的Assets。
GIF動畫可以自己做,如透過RoughAminator或Clip Studio Paint等軟體,但這次重點在程式,所以直接在網路上下載GIF圖片來使用。
下載的GIF其實是多張圖片組成,但檔案還是只有1個,需要轉檔轉成多張圖片。
把GIF轉檔為多張PNG。
把檔案加入xcode的Assets。
2. 在ViewController.swift裡的func viewDidLoad裡設定image view播放連續動畫。
》》》… 讓動畫一直跑一直跑的方法:
程式概念:在fun viewDidLoad裡寫上程式。1. 產生UIImageView,設定動畫在App上要出現的位置(座標)及尺寸 ☞ let imageView = UIImageView(frame: CGFrect(x:, y:, width:, height:)2. 把imageView加到view Controller裡(view controller也是一個view),imageView是view的subview。 ☞ view.addSubview(imageView)3. 產生動畫的UIImage,把之前分解好的圖片加入,並設定時間(duration,sec.) ☞ let animatedImage = UIImage.animatedImageNamed("a06fc2aa3f2a4968e4716e36f4a0cb3b-", duration: 1)4. 把生成的動畫UIImage指定到UIImageView ☞ imageView.image = animatedImage5. 開始動畫 ☞ imageView.startAnimating()
* 分解的圖片名稱結尾必須是數字,並依序遞增,因為 function animatedImageNamed 將以此決定圖片動畫的順序。* 傳入UIImage.animatedImageNamed的圖片檔名結束在「-」,之後的xcode會自動依圖片名稱尾數抓圖片的順序。* 圖片名字結尾的數字最大可以到 1024,因此我們最多可以用 1025 張圖片組合出動畫
》》》動畫跑固定次數時?
要改用 animationImages 才能限制動畫播放的次數!
程式概念:1. 產生UIImageView,設定動畫在App上要出現的位置(座標)及尺寸 ☞ let imageView = UIImageView(frame: CGFrect(x:, y:, width:, height:)2. 把imageView加到view Controller裡(view controller也是一個view),imageView是view的subview。 ☞ view.addSubview(imageView)
------ 以下開始設定固定次數,用array及animationImages ---------
3. 產生動畫圖片的array,將它存到image view的animationImages ☞ var images = [UIImage]()
for i in 0...7 {
images.append(UIImage(named: "a06fc2aa3f2a4968e4716e36f4a0cb3b-\(i)")!)
} imageView.animationImages = images4. 設定動畫播放相關參數 - 動畫時間 ☞ imageView.animationDuration = 1 - 動畫播放次數 ☞ imageView.animationRepeatCount = 1 - 設定image view的圖片為動畫的最後一張圖
☞ imageView.image = images.last
(如果沒有設最後一張圖,動畫結束時就會直接消失在畫面中)5. 開始動畫 ☞ imageView.startAnimating()
完整程式:連續播放動畫
//連續播放動畫import UIKitclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()//改變view controller的背景顏色
view.backgroundColor = UIColor(red: 236/255, green: 226/255, blue: 140/255, alpha: 1)let animatedImageView = UIImageView(frame: CGRect(x: 40, y: 100, width: 300, height: 300))view.addSubview(animatedImageView)let animatedImage = UIImage.animatedImageNamed("619f837be5984330a664cdd6dfa5f06fyjk38PhIEvke4wHO-", duration: 4)animatedImageView.image = animatedImageanimatedImageView.startAnimating()}}
完整程式:播放動畫2次
//播放動畫2次import UIKitclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()view.backgroundColor = UIColor(red: 180/255, green: 235/255, blue: 227/255, alpha: 1)let catImageView = UIImageView(frame: CGRect(x: 40, y: 100, width: 300, height: 300))view.addSubview(catImageView)
var catImage = [UIImage]()for i in 0...57 {catImage.append(UIImage(named: "619f837be5984330a664cdd6dfa5f06fyjk38PhIEvke4wHO-\(i)")!)}catImageView.animationImages = catImagecatImageView.animationDuration = 4catImageView.animationRepeatCount = 2catImageView.image = catImage.lastcatImageView.startAnimating()}}
補充:
陣列(array)的概念: 容納多個東西- 當變數無敵多的時候(ex:喜歡吃的食物有很多、做成動畫的多張圖片...),我們不太可能每一筆資料都存成var,這時候就是array出場的時候了。- 任何型別的資料都可以存在array裡面,但存在array裡的資料都是同一型別。- 資料存在array裡面後,再讀取[號碼],也就是array裡的第?個資料,從0開始。
相關參考連結:
圖片來源: