国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Swift洗牌動畫效果的實(shí)現(xiàn)方法

2019-11-26 13:23:04
字體:
供稿:網(wǎng)友

目標(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)

把每個(gè)卡牌作為UIImageView創(chuàng)建出來,為了之后對這些牌進(jìn)行操作 我用數(shù)組把他們持有住 在同一位置創(chuàng)建好了之后 使用本地通知發(fā)送setCreated消息 告訴這個(gè)頁面的觀察者card set已經(jīng)創(chuàng)建完畢 可以開始執(zhí)行第二步動畫

2: 首先需要把開始動畫的按鈕的用戶交互關(guān)閉,如果開著的話連續(xù)點(diǎn)擊每次都會創(chuàng)建50張牌,導(dǎo)致程序卡頓甚至掛掉

這里的delayTime是給線程加一個(gè)延遲時(shí)間 只是為了讓動畫不很生硬

每次循環(huán)給對應(yīng)下標(biāo)的card對象添加旋轉(zhuǎn)動畫,并且改變它的原點(diǎn),我在用UIView動畫實(shí)現(xiàn)這套動畫之前想過給每張牌添加貝塞爾曲線,那樣的話確實(shí)可控性更高,但是由于時(shí)間關(guān)系我還是只用了UIViewAnimation,給card添加的旋轉(zhuǎn)動畫是使用POP動畫庫實(shí)現(xiàn)的,這里使用的是Basic動畫.這一步結(jié)束之后會把每張牌旋轉(zhuǎn)并散開到不同的位置,在delayTime結(jié)束并觸發(fā)本地通知發(fā)送shuffleFinished的時(shí)候,這個(gè)頁面的觀察者會執(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)

牌洗完之后的需求是切牌,由于時(shí)間原因下周繼續(xù)更新后續(xù)動畫效果…

以上所述是小編給大家介紹的Swift洗牌動畫效果的實(shí)現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安福县| 荔浦县| 霸州市| 汽车| 明光市| 琼海市| 余姚市| 甘孜县| 香河县| 平泉县| 深州市| 黄冈市| 炎陵县| 岳阳市| 时尚| 方正县| 马公市| 休宁县| 镇雄县| 宁海县| 嘉禾县| 旬阳县| 临漳县| 仁化县| 通道| 榆中县| 九龙坡区| 阿瓦提县| 福海县| 梁平县| 顺昌县| 庐江县| 运城市| 桂林市| 明水县| 加查县| 成安县| 象山县| 龙海市| 枣强县| 敦煌市|