Swift洗牌動畫效果的實現(xià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)建出來,為了之后對這些牌進行操作 我用數(shù)組把他們持有住 在同一位置創(chuàng)建好了之后 使用本地通知發(fā)送setCreated消息 告訴這個頁面的觀察者card set已經(jīng)創(chuàng)建完畢 可以開始執(zhí)行第二步動畫
2: 首先需要把開始動畫的按鈕的用戶交互關閉,如果開著的話連續(xù)點擊每次都會創(chuàng)建50張牌,導致程序卡頓甚至掛掉
這里的delayTime是給線程加一個延遲時間 只是為了讓動畫不很生硬
每次循環(huán)給對應下標的card對象添加旋轉動畫,并且改變它的原點,我在用UIView動畫實現(xiàn)這套動畫之前想過給每張牌添加貝塞爾曲線,那樣的話確實可控性更高,但是由于時間關系我還是只用了UIViewAnimation,給card添加的旋轉動畫是使用POP動畫庫實現(xiàn)的,這里使用的是Basic動畫.這一步結束之后會把每張牌旋轉并散開到不同的位置,在delayTime結束并觸發(fā)本地通知發(fā)送shuffleFinished的時候,這個頁面的觀察者會執(zhí)行下一部動畫 也就是把每張牌還原到動畫起點
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設置為切牌狀態(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洗牌動畫效果的實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
SpringBoot項目讀取外置logback配置文件的問題及解決
SpringBoot項目讀取外置logback配置文件的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08java處理數(shù)據(jù)庫不支持的emoji表情符問題解決
這篇文章主要介紹了java處理數(shù)據(jù)庫不支持的emoji表情符問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09java常用工具類 Reflect反射工具類、String字符串工具類
這篇文章主要為大家詳細介紹了java常用工具類,包括Reflect反射工具類、String字符串工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼
這篇文章主要介紹了webuploader在springMVC+jquery+Java開發(fā)環(huán)境下的大文件分片上傳的實例代碼,需要的朋友可以參考下2017-04-04