利用 viewDidLoad 客製 App 畫面
讓初始畫面出現想要的顏色、圖案和動畫
viewDidLoad的功能特色:
・viewDidLoad()由系統自己呼叫
・可以在viewDidLoad下設置view的屬性,例如初始背景顏色、邊框等
・viewDidLoad() 只會在viewContrller首次加載的時候執行(被呼叫一次), 如果是每次進入viewContrller時都執行的操作,就要使用viewWillAppear()
viewDidLoad & viewWillAppear比較
・viewDidLoad:初始化&設置頁面的初始狀態
以社群App的朋友列表頁面為例,可以在viewDidLoad()中設置初始view的樣式、初始資料,如從伺服器或本地獲取資料、cell外觀等。讓頁面載入完成後系統自動幫忙呼叫這些初始值。
・viewWillAppear :每次進入頁面時都執行的操作
如果進入朋友列表頁面前可能有新的資料更新 (像新增朋友、列表狀態和排序更新),或是希望在每次顯示頁面時執行動畫特效時,就可以在viewWillAppear()中執行刷新資料的操作
實際以viewDidLoad設定初始畫面
開啟app後,讓系統自動讀入背景顏色、
override func viewDidLoad() {
super.viewDidLoad()
//背景顏色
view.backgroundColor = UIColor(red: 244/255, green: 208/255, blue: 110/205, alpha: 1)
//橫幅
let bannerView = SharpView(frame: CGRect(x: 0, y: 20, width: 415, height: 150))
bannerView.backgroundColor = UIColor(white: 1, alpha: 0.3)
view.addSubview(bannerView)
func startRaining(){
//背景下香蕉雨
let bananaEmitterCell = CAEmitterCell()
bananaEmitterCell.contents = UIImage(named: "banana.png")?.cgImage
bananaEmitterCell.birthRate = 2
bananaEmitterCell.lifetime = 20
bananaEmitterCell.velocity = 100
bananaEmitterCell.scale = 0.1
bananaEmitterCell.scaleRange = 0.3
bananaEmitterCell.scaleSpeed = -0.05
bananaEmitterCell.yAcceleration = 30
let bananaEmitterLayer = CAEmitterLayer()
bananaEmitterLayer.emitterCells = [bananaEmitterCell]
bananaEmitterLayer.emitterPosition = CGPoint(x: view.bounds.width/2, y: -50)
bananaEmitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 0)
bananaEmitterLayer.emitterShape = .line
view.layer.addSublayer(bananaEmitterLayer)
}
// 設定香蕉gif
let bananaImageView = UIImageView(frame: CGRect(x: 345, y: 54, width: 30, height: 30))
view.addSubview(bananaImageView)
let animatedImage = UIImage.animatedImageNamed("2e296252fda9478e872bbd809327076as66BkQL5UDSEm65N-", duration: 10)
bananaImageView.image = animatedIma
}
製作香蕉雨動畫
建立一個function來實現下香蕉雨的動畫,function中使用CAEmitterCell和 CAEmitterLayer。CAEmitterCell可以定義單一香蕉的粒子(particles)效果,CAEmitterLayer來管理粒子的發射。
1. CAEmitterCell : 定義單一香蕉的粒子效果
contents
: 設定粒子的顯示內容為 "banana.png" 圖片。birthRate
: 每秒產生的粒子數量為 2。lifetime
: 每個粒子的生命週期為 20 秒。velocity
: 設定粒子的初始速度為 100。scale
: 設定粒子的初始縮放為 0.1。scaleRange
: 設定縮放的範圍為 0.3,使得每個粒子的縮放在初始值上再隨機增減 0.3。scaleSpeed
: 設定縮放的變化速度為 -0.05。yAcceleration
: 設定在 Y 軸方向上的加速度為 30。
2. CAEmitterLayer: 管理粒子的發射
emitterCells
: 將先前定義的bananaEmitterCell
設定為發射器的粒子。emitterPosition
: 設定粒子系統的發射位置為畫面的正中央頂部。emitterSize
: 設定粒子系統的發射大小為整個畫面的寬度,高度為 0。emitterShape
: 設定粒子系統的形狀為線性,使得粒子從一條線上發射
3. 最後將 bananaEmitterLayer
加入到畫面的 layer 中,使效顯示在畫面上。
view.layer.addSublayer(bananaEmitterLayer)
:
func startRaining(){
//背景下香蕉雨
let bananaEmitterCell = CAEmitterCell()
bananaEmitterCell.contents = UIImage(named: "banana.png")?.cgImage
bananaEmitterCell.birthRate = 2
bananaEmitterCell.lifetime = 20
bananaEmitterCell.velocity = 100
bananaEmitterCell.scale = 0.1
bananaEmitterCell.scaleRange = 0.3
bananaEmitterCell.scaleSpeed = -0.05
bananaEmitterCell.yAcceleration = 30
let bananaEmitterLayer = CAEmitterLayer()
bananaEmitterLayer.emitterCells = [bananaEmitterCell]
bananaEmitterLayer.emitterPosition = CGPoint(x: view.bounds.width/2, y: -50)
bananaEmitterLayer.emitterSize = CGSize(width: view.bounds.width, height: 0)
bananaEmitterLayer.emitterShape = .line
view.layer.addSublayer(bananaEmitterLayer)
}
製作香蕉GIF
可參考之前寫的這篇文章