Swift洗牌動畫效果的實(shí)現(xiàn)方法
目標(biāo)效果: 點(diǎn)擊動畫按鈕之后每張牌各自旋轉(zhuǎn) 散開到屏幕上半部分的任意位置之后回到初始位置 比較像LOL男刀的技能動畫 : )
1: 創(chuàng)建卡牌對象
for _ in 0...49 {
let cardSet = UIImageView(image: UIImage(named: "cardBackLandscape"))
self.view.addSubview(cardSet)
cardSet.frame = self.landscapeCardBack.frame
self.cardSetList.append(cardSet)
}
NSNotificationCenter.defaultCenter().postNotificationName("setCreated", object: nil)
把每個卡牌作為UIImageView創(chuàng)建出來,為了之后對這些牌進(jìn)行操作 我用數(shù)組把他們持有住 在同一位置創(chuàng)建好了之后 使用本地通知發(fā)送setCreated消息 告訴這個頁面的觀察者card set已經(jīng)創(chuàng)建完畢 可以開始執(zhí)行第二步動畫
2: 首先需要把開始動畫的按鈕的用戶交互關(guān)閉,如果開著的話連續(xù)點(diǎn)擊每次都會創(chuàng)建50張牌,導(dǎo)致程序卡頓甚至掛掉
這里的delayTime是給線程加一個延遲時間 只是為了讓動畫不很生硬
每次循環(huán)給對應(yīng)下標(biāo)的card對象添加旋轉(zhuǎn)動畫,并且改變它的原點(diǎn),我在用UIView動畫實(shí)現(xiàn)這套動畫之前想過給每張牌添加貝塞爾曲線,那樣的話確實(shí)可控性更高,但是由于時間關(guān)系我還是只用了UIViewAnimation,給card添加的旋轉(zhuǎn)動畫是使用POP動畫庫實(shí)現(xiàn)的,這里使用的是Basic動畫.這一步結(jié)束之后會把每張牌旋轉(zhuǎn)并散開到不同的位置,在delayTime結(jié)束并觸發(fā)本地通知發(fā)送shuffleFinished的時候,這個頁面的觀察者會執(zhí)行下一部動畫 也就是把每張牌還原到動畫起點(diǎn)
func shuffleTheSet() {
self.shuffleButton.userInteractionEnabled = false
let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
NSNotificationCenter.defaultCenter().postNotificationName("shuffleFinished", object: nil)
}
for count in 0...49 {
UIView.animateWithDuration(0.3, animations: {
let cardRotateAnimation = POPBasicAnimation(propertyNamed: kPOPLayerRotation)
cardRotateAnimation.fromValue = 0
cardRotateAnimation.toValue = CGFloat(M_PI * 2.0)
cardRotateAnimation.duration = 1
// cardRotateAnimation.duration = Double(count>5 ? count/2 : count/10)
cardRotateAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear)
self.cardSetList[count].layer.pop_addAnimation(cardRotateAnimation, forKey: "cardRotation")
self.cardSetList[count].frame.origin = CGPointMake(CGFloat(arc4random()) % (250 - 0 + 1) + 0, CGFloat(arc4random()) % (300 - 74 + 1) + 74)
self.view.layoutIfNeeded()
self.landscapeCardBack.removeFromSuperview()
})
}
}
3: 把每張牌的還原到初始位置,并把button的title設(shè)置為切牌狀態(tài).
for count in 0...49 {
UIView.animateWithDuration(0.3, animations: {
self.cardSetList[count].center = self.landscapeCardBack.center
})
self.view.layoutIfNeeded()
}
self.shuffleButton.userInteractionEnabled = true
self.shuffleButton.setTitle("Cut Card", forState: .Normal)
牌洗完之后的需求是切牌,由于時間原因下周繼續(xù)更新后續(xù)動畫效果…
以上所述是小編給大家介紹的Swift洗牌動畫效果的實(shí)現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Spring Security注冊過濾器注意事項(xiàng)詳解
前兩天和小伙伴聊了 Spring Security+JWT 實(shí)現(xiàn)無狀態(tài)登錄,然后有小伙伴反饋了一個問題,感覺這是一個我們平時寫代碼容易忽略的問題,所以本文給大家介紹了Spring Security注冊過濾器注意事項(xiàng),需要的朋友可以參考下2024-06-06
SpringBoot項(xiàng)目讀取外置logback配置文件的問題及解決
SpringBoot項(xiàng)目讀取外置logback配置文件的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
java處理數(shù)據(jù)庫不支持的emoji表情符問題解決
這篇文章主要介紹了java處理數(shù)據(jù)庫不支持的emoji表情符問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
java常用工具類 Reflect反射工具類、String字符串工具類
這篇文章主要為大家詳細(xì)介紹了java常用工具類,包括Reflect反射工具類、String字符串工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼
這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實(shí)例代碼,需要的朋友可以參考下2017-04-04

