View組合動畫
前幾節中我們已經學習了基本的View動畫,其實我們已經可以通過這些技術的組合實現非常酷炫的效果了,這節我們不會涉及新的API,一起來學習一下View動畫的組合
背景圖片的漸變效果
背景圖片的漸變效果在很多應用中都會遇到,其實利用前幾節學習到的基本View動畫就可以做到
我們現在希望在這兩個界面間進行切換
由于我們希望能夠柔和地過渡到第二個圖片,如果我們直接替換圖片的話會顯得非常突然。所以我們采用先添加一個圖層,逐漸改變透明度,最終替換圖片再移除之前的圖層的方法,逐漸改變界面背景
這里我們使用UIView.animateWithDuration
方法實現切換圖片的方法
其中的Effects指雪花的效果
func fadeImageView(imageView:UIImageView,toImage:UIImage,showEffects:Bool){
let newImageView = UIImageView(image: toImage)
//新建一個圖層
newImageView.frame = view.frame
newImageView.alpha = 0.0
UIView.animateWithDuration(0.33, animations: { () -> Void in
//分別改變透明度
newImageView.alpha=1.0
self.snowView.alpha = showEffects ? 1.0 : 0.0
//添加圖層above于原圖片
self.view.insertSubview(newImageView, aboveSubview: imageView)
}) { _ -> Void in
//完成后替換圖片并移除圖層
imageView.image = newImageView.image
newImageView.removeFromSuperview()
}
}
隨后我們在改變的背景的方法中調用上面的動畫
func changeFlightDataAnimatedTo(data:FlightData){
fadeImageView(bgImageView, toImage: UIImage(named: data.weatherImageName)!, showEffects: data.showWeatherEffects)
delay(seconds: 3.0) {
self.changeFlightDataAnimatedTo(data.isTakingOff ? parisToRome : londonToParis)
}
}
Cube transitions
這里介紹一種常用的文字改變動畫
文字的變化就如同將文字寫在立方體的兩個面上,并轉動立方體
這不是一種真正的3D效果,不過也是練習基礎View動畫的好機會
你的動畫方法將有一個參數用來指定方向
首先我們定義一個枚舉來表示轉動方向
enum AnimationDirection: Int { case Positive = 1
case Negative = -1
}
下面我們來寫一下這個動畫函數,其參數如下
label: 你想要動畫改變的Label.
text: 接下來想顯示的文字.
direction: 轉動方向.
首先來做一個原Label除文字外的拷貝
func cubeTransition(label label: UILabel, text: String, direction: AnimationDirection) {
let auxLabel = UILabel(frame: label.frame)
auxLabel.text = text
auxLabel.font = label.font
auxLabel.textAlignment = label.textAlignment
auxLabel.textColor = label.textColor auxLabel.backgroundColor = label.backgroundColor
}
隨后我們來計算垂直方向上的補償,并將Label變形
let auxLabelOffset = CGFloat(direction.rawValue) * label.frame.size.height/2.0
//同時進行兩個變形動畫
auxLabel.transform = CGAffineTransformConcat( CGAffineTransformMakeScale(1.0, 0.1), CGAffineTransformMakeTranslation(0.0, auxLabelOffset))
label.superview!.addSubview(auxLabel)
UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseOut, animations: {
auxLabel.transform = CGAffineTransformIdentity label.transform = CGAffineTransformConcat(
CGAffineTransformMakeScale(1.0, 0.1),
CGAffineTransformMakeTranslation(0.0, -auxLabelOffset)) }, completion: {_ in
label.text = auxLabel.text
label.transform = CGAffineTransformIdentity
auxLabel.removeFromSuperview() })
未完