亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS實現日歷翻頁動畫

2020-07-26 03:17:25
字體:
來源:轉載
供稿:網友

本文我主要描述兩方面:

    1.日歷(簡單描述原理)

    2.翻頁動畫(重點)

最終的效果如下圖:

    圖中沿四個對角的翻頁動畫,代表對應方向手勢的滑動

1. 日歷

要實現一個日歷,其實原理很簡單,我們只要知道三個數據:

    1.今天是哪一天

    2.這個月的第一天是星期幾(哪天)

    3.這個月總共有多少天

根據這個三個數據,就可以把得到的日期顯示在日歷上了,至于日歷用什么來顯示,我個人比較喜歡用UICollectionView,一個cell代表一天,當然也可以用很多個label,button來顯示。

1.獲取今天是哪一天

這個應該是最簡單的: NSDate() , 就可以獲取當前的日期

2.獲取這個月的第一天是星期幾(哪天)

下面的方法都是作為NSDateextension擴展的

//當前月第一天func firstDateOfCurrentMonth() ->NSDate{  let calendar = NSCalendar(identifier:NSCalendarIdentifierGregorian )  let currentDateComponents = calendar!.components([.Year,.Month], fromDate: self)  let startOfMonth = calendar!.dateFromComponents(currentDateComponents)  let date = startOfMonth?.dateByAddingTimeInterval(8*60*60)  return date!}//當前月的第一天是星期幾func firstDayOfCurrentMonth() -> Int {  let calendar = NSCalendar.currentCalendar()  let components = calendar.components(.Weekday, fromDate: firstDateOfCurrentMonth())  return components.weekday-1}

3.獲取這個月總共有多少天

根絕上面這些數據,就可以得到日歷里面每個格子應該顯示的日期,具體的顯示和有關日期的三個主要的類: NSDate, NSCalendar, NSDateComponents 由于不是本文的重點,我這里就不詳細說了,如果有不明白的可以去看一下文檔,或者如果我下次寫一個詳細的關于這三個類的(又挖一個坑。。)。

2. 翻頁動畫

動畫思路:

上面的動畫屬于轉場動畫的一種,所以我們可以利用CATrasition進行動畫,CATransition的使用非常簡單,只要設置動畫時長,時間函數,fillMode等,就可以得到想要的動畫,CATransitiontype代表的是過渡時候的動畫效果,subType一般代表動畫的方向,但是查看了一下CATransitiontype屬性,官方文檔里面只描述了下面四種預定義的轉場動畫效果:

NSString * const kCATransitionFade;NSString * const kCATransitionMoveIn;NSString * const kCATransitionPush;NSString * const kCATransitionReveal;

我們需要的翻頁動畫并不在里面,在google了一下之后,找到了一個比較理想的效果,通過直接設置CATransitiontype為"pageCurl"或"pangeUnCurl"進行動畫,這兩個值官方文檔沒有提供,我也不知道為啥這些大神能找到。。。

但是默認的朝上翻頁只有左上角方向的動畫,朝下翻頁只有右下角方向的動畫

做出來的效果如下圖:

無法達到四個對角都能進行翻頁動畫的效果。

為了得到可以沿著四個對角方向翻頁的效果,我們可以先在最底部添加一個containerView,然后在containerView中添加dayView(下面提到的dayView和代碼中的dayView都代表的是作為日歷的collectionView)。

如果要進行朝右上角翻頁,我們只要把containerViewlayer先沿y軸翻轉M_PI,這樣,最開始的右下角就變成左下角了,翻頁時就會變成向右上角翻頁

但是為了日歷顯示正確,我們需要把dayViewlayer重新翻轉過來,這樣,containerView是反的,但是我們看到的日期顯示是正的

左下角翻頁也是同樣的道理。

具體代碼如下:

//為dayView(代表日歷的collectionview)添加一個滑動手勢func addPanGestureToDayView() {  let swipe = UIPanGestureRecognizer(target: self, action: #selector(self.panOnDayView(_:)))  dayView.addGestureRecognizer(swipe)}//當在dayView上滑動時觸發func panOnDayView(pan: UIPanGestureRecognizer) {  //如果手勢的狀態是結束狀態  //或者當前動畫已經結束(防止上一個翻頁動畫還沒結束,就開始下一個)  //添加翻頁的轉場動畫到dayView上  if pan.state == .Ended && !animatiing{    addAnimationToDayView(pan)  }}let pageCurlDuration = 0.5  //動畫時間let kPageCurlKey = "pageCurl"   //往上翻頁的的typelet kPageUnCurlKey = "pageUnCurl"  //往下翻頁的type//添加動畫到日歷func addAnimationToDayView(pan: UIPanGestureRecognizer) {  let translation = pan.translationInView(dayView)  //創建一個轉場動畫  let transitioin = CATransition()  transitioin.duration = pageCurlDuration  transitioin.timingFunction = CAMediaTimingFunction(name: "default")  //在動畫結束之后保證狀態不被移除(這個兩個屬性得同時設置)  transitioin.fillMode = kCAFillModeForwards  transitioin.removedOnCompletion = false  //設置代理,在動畫開始和結束的代理方法中可以處理一些事情  transitioin.delegate = self  if translation.y < 0 {//手勢向上  *  *    if translation.x > 0 {//手勢朝右上角滑動,朝右上翻頁      //沿y軸對containerView進行M_PI角度翻轉,使containerView的右下角變為左下角      animationContainerView.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0)      //因為dayView是加在containerView上面的,如果不把dayView重新翻轉回去,顯示出來的界面都是反的      dayView.layer.transform = CATransform3DMakeRotation(CGFloat(-M_PI), 0, 1, 0)    }    //轉場動畫的效果    transitioin.type = kPageCurlKey    //轉場動畫方向    transitioin.subtype = kCATransitionFromBottom    //設置一個month的key,為了在動畫結束時判斷動畫代表的是上一個月,還是下一個月    transitioin.setValue("next", forKey: "month")  }else{//下    if translation.x < 0 {//手勢朝左下角滑動,朝左下翻頁      animationContainerView.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0)      dayView.layer.transform = CATransform3DMakeRotation(CGFloat(-M_PI), 0, 1, 0)    }    transitioin.type = kPageUnCurlKey    transitioin.subtype = kCATransitionFromTop    transitioin.setValue("pre", forKey: "month")  }  dayView.layer.addAnimation(transitioin, forKey: "pageCurl")}

動畫開始和停止時,進行一些處理:

//因為上面設置了 transitioin.delegate = self,這兩個代理方法會自動調用override func animationDidStart(anim: CAAnimation) {  //動畫開始時,判斷當前動畫是代表往上翻頁,還是往下翻頁,來刷新日歷時間  animatiing = true  let components = GregorianCalendar?.components([.Year,.Month,.Day], fromDate: date)  if anim.valueForKey("month") as! String == "next" {    components?.month += 1  }else if anim.valueForKey("month") as! String == "pre"{    components?.month -= 1  }  date = (GregorianCalendar?.dateFromComponents(components!))!  dateDidChaged!(date: date)}//動畫結束時,將layer的transform屬性設置為初始值,并移除dayView的layer上翻頁的動畫override func animationDidStop(anim: CAAnimation, finished flag: Bool) {  if flag {    animatiing = false    animationContainerView.layer.transform = CATransform3DIdentity    dayView.layer.transform = CATransform3DIdentity    dayView.layer.removeAnimationForKey("pageCurl")  }}

總結:

這篇文章沒有介紹太多詳細的內容,其實翻頁的動畫實現還有別的方法,但是因為我想實現的是可以沿著四個對角進行動畫的效果,所以最終選擇了這個方法,上面說的好像不是很具體,如果不是很明白,可以先查看一下CATranstion的使用方法。以上就是本文的全部內容,希望對大家開發IOS動畫的時候能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久免费高清电视剧观看| 欧美理论片在线观看| 日本精品一区二区三区在线| 亚洲欧美在线免费观看| 欧美在线免费观看| 日本a级片电影一区二区| 欧美精品情趣视频| 91网站在线看| 国产午夜精品免费一区二区三区| 欧美在线视频免费| 国产91精品久久久久久久| 欧美一级淫片aaaaaaa视频| 日韩电影中文 亚洲精品乱码| 国产精品欧美日韩久久| 2019中文在线观看| 色老头一区二区三区在线观看| 日本最新高清不卡中文字幕| 亚洲国产日韩一区| 国产精品99导航| 欧美亚洲激情在线| 久久久久久久久久国产| 亚洲欧美日韩成人| 亚洲国产精品一区二区三区| 欧美日韩国产综合视频在线观看中文| 久操成人在线视频| 成人春色激情网| 日韩在线视频中文字幕| 国产成人综合av| 性欧美办公室18xxxxhd| 国产亚洲精品一区二区| 亚洲精品国产精品久久清纯直播| 久久91精品国产91久久跳| 国产成人在线视频| 日日骚久久av| 日本精品一区二区三区在线| 黄色成人av网| 欧美激情国产精品| 精品国产一区二区三区久久| 国产国语刺激对白av不卡| 91丨九色丨国产在线| 最新91在线视频| 亚洲毛片在线免费观看| 国产福利精品av综合导导航| 国产精品九九久久久久久久| 欧美极品少妇xxxxⅹ裸体艺术| 欧美日韩国产成人在线| 亚洲欧美成人一区二区在线电影| 原创国产精品91| www.国产一区| 精品久久久免费| 日韩高清不卡av| 久久精视频免费在线久久完整在线看| 亚洲欧美中文日韩在线v日本| 久久久精品视频成人| 亚洲毛茸茸少妇高潮呻吟| 国产亚洲欧美视频| 人九九综合九九宗合| 亚洲欧美变态国产另类| 亚洲成**性毛茸茸| 亚洲精品720p| 精品一区二区三区四区在线| 日韩免费看的电影电视剧大全| 国产精品吊钟奶在线| 亚洲国产日韩欧美在线99| 97人人模人人爽人人喊中文字| 亚洲精品mp4| 日韩欧美在线观看视频| 亚洲女人初尝黑人巨大| 成人激情视频在线| 久久精品久久久久电影| 色偷偷噜噜噜亚洲男人的天堂| 亚洲人成电影在线观看天堂色| 欧美一级在线播放| 中文字幕日韩精品在线观看| 亚洲日韩中文字幕| 亚洲国产精品久久久久久| 日韩免费电影在线观看| 中文字幕亚洲欧美日韩在线不卡| 国产xxx69麻豆国语对白| 精品久久久在线观看| 国产精品久久视频| 91久久久在线| 亚洲色图国产精品| 欧美日韩性视频在线| 亚洲男人的天堂网站| 97碰碰碰免费色视频| 亚洲欧美日韩中文在线制服| 国产日韩欧美日韩| 久久亚洲精品成人| 久久久久久久影院| 欧美极品少妇与黑人| 日产精品久久久一区二区福利| 亚洲精品98久久久久久中文字幕| 亚洲综合中文字幕在线| 精品日韩美女的视频高清| 亚洲日韩欧美视频| 久久久久久久久久久久av| 亚洲无亚洲人成网站77777| 在线播放国产一区二区三区| 亚洲欧美日本精品| 欧美国产第二页| 日韩影视在线观看| 中文字幕久久亚洲| 日韩精品视频在线观看免费| 久久久亚洲天堂| 午夜精品久久久久久久久久久久久| 亚洲精品视频网上网址在线观看| 国产精品999999| 国产精品入口福利| 日韩中文字幕在线| 81精品国产乱码久久久久久| 欧美视频免费在线| 日韩在线免费视频观看| 中文字幕亚洲欧美日韩高清| 国内免费久久久久久久久久久| 亚洲欧美日韩中文视频| 国产97在线播放| 久久久噜噜噜久久久| 亚洲一区二区三区毛片| 国产精品欧美风情| 精品中文字幕在线观看| 欧美性色xo影院| 久久精品国产亚洲精品2020| 欧美在线日韩在线| 精品久久久久久久久久久久久| 最近2019中文字幕在线高清| 久久亚洲成人精品| 久久韩剧网电视剧| 日韩免费高清在线观看| 热久久免费国产视频| 日韩av片永久免费网站| 九九热精品视频国产| 久久久久久国产精品| 欧美激情一区二区三区久久久| 国产精品久久婷婷六月丁香| 亚洲热线99精品视频| 国产精品看片资源| 毛片精品免费在线观看| 欧美在线视频观看免费网站| 欧美亚洲视频一区二区| 久久久国产一区| 国模视频一区二区三区| 亚洲va欧美va在线观看| 久久精品国产视频| 色婷婷综合久久久久| 久久久人成影片一区二区三区观看| 久久久亚洲福利精品午夜| 成人国产精品一区二区| 国产91精品不卡视频| 亚洲精品99久久久久| 国产精品国内视频| 欧美久久精品一级黑人c片| 操人视频在线观看欧美| 精品网站999www| 久久久午夜视频| 欧美成人免费大片| 国产欧美在线看| 亚洲精品aⅴ中文字幕乱码| 自拍偷拍亚洲区| 91精品视频播放| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲国产成人一区| 亚洲电影免费在线观看| 色婷婷综合久久久久|