最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS實現(xiàn)日歷翻頁動畫

 更新時間:2016年08月04日 09:12:31   投稿:daisy  
本文的內(nèi)容主要是在IOS中實現(xiàn)日歷翻頁的動畫,界面簡單但效果很好,以后可以運用到app中,下面一起來看看。

本文我主要描述兩方面:

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

    2.翻頁動畫(重點)

最終的效果如下圖:

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

1. 日歷

要實現(xiàn)一個日歷,其實原理很簡單,我們只要知道三個數(shù)據(jù):

    1.今天是哪一天

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

    3.這個月總共有多少天

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

1.獲取今天是哪一天

這個應(yīng)該是最簡單的: 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.獲取這個月總共有多少天

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

2. 翻頁動畫

動畫思路:

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

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

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

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

做出來的效果如下圖:

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

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

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

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

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

具體代碼如下:

//為dayView(代表日歷的collectionview)添加一個滑動手勢
func addPanGestureToDayView() {
  let swipe = UIPanGestureRecognizer(target: self, action: #selector(self.panOnDayView(_:)))
  dayView.addGestureRecognizer(swipe)
}

//當在dayView上滑動時觸發(fā)
func panOnDayView(pan: UIPanGestureRecognizer) {
  //如果手勢的狀態(tài)是結(jié)束狀態(tài)
  //或者當前動畫已經(jīng)結(jié)束(防止上一個翻頁動畫還沒結(jié)束,就開始下一個)
  //添加翻頁的轉(zhuǎn)場動畫到dayView上
  if pan.state == .Ended && !animatiing{
    addAnimationToDayView(pan)
  }
}

let pageCurlDuration = 0.5  //動畫時間
let kPageCurlKey = "pageCurl"   //往上翻頁的的type
let kPageUnCurlKey = "pageUnCurl"  //往下翻頁的type

//添加動畫到日歷
func addAnimationToDayView(pan: UIPanGestureRecognizer) {
  let translation = pan.translationInView(dayView)
  //創(chuàng)建一個轉(zhuǎn)場動畫
  let transitioin = CATransition()
  transitioin.duration = pageCurlDuration
  transitioin.timingFunction = CAMediaTimingFunction(name: "default")
  //在動畫結(jié)束之后保證狀態(tài)不被移除(這個兩個屬性得同時設(shè)置)
  transitioin.fillMode = kCAFillModeForwards
  transitioin.removedOnCompletion = false
  //設(shè)置代理,在動畫開始和結(jié)束的代理方法中可以處理一些事情
  transitioin.delegate = self
  if translation.y < 0 {//手勢向上
  *
  *
    if translation.x > 0 {//手勢朝右上角滑動,朝右上翻頁
      //沿y軸對containerView進行M_PI角度翻轉(zhuǎn),使containerView的右下角變?yōu)樽笙陆?
      animationContainerView.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 0, 1, 0)
      //因為dayView是加在containerView上面的,如果不把dayView重新翻轉(zhuǎn)回去,顯示出來的界面都是反的
      dayView.layer.transform = CATransform3DMakeRotation(CGFloat(-M_PI), 0, 1, 0)
    }
    //轉(zhuǎn)場動畫的效果
    transitioin.type = kPageCurlKey
    //轉(zhuǎn)場動畫方向
    transitioin.subtype = kCATransitionFromBottom
    //設(shè)置一個month的key,為了在動畫結(jié)束時判斷動畫代表的是上一個月,還是下一個月
    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")
}

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

//因為上面設(shè)置了 transitioin.delegate = self,這兩個代理方法會自動調(diào)用
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)
}

//動畫結(jié)束時,將layer的transform屬性設(shè)置為初始值,并移除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")
  }
}

總結(jié):

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

相關(guān)文章

  • iOS 微信分享功能簡單實現(xiàn)

    iOS 微信分享功能簡單實現(xiàn)

    本文介紹了iOS 微信分享功能的實現(xiàn)步驟與方法,具有一定的參考作用。下面跟著小編一起來看下吧
    2017-01-01
  • iOS開發(fā)中對文件目錄的訪問及管理的基本方法小結(jié)

    iOS開發(fā)中對文件目錄的訪問及管理的基本方法小結(jié)

    這篇文章主要介紹了iOS開發(fā)中對文件目錄的訪問及管理的基本方法小結(jié),代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-10-10
  • iOS 獲取公歷、農(nóng)歷日期的年月日的實例代碼

    iOS 獲取公歷、農(nóng)歷日期的年月日的實例代碼

    本篇文章主要介紹了iOS 獲取公歷、農(nóng)歷日期的年月日的實例代碼,主要介紹了三種方法,具有一定的參考價值,有興趣的可以了解一下。
    2017-02-02
  • iOS WebSocket長鏈接的實現(xiàn)方法

    iOS WebSocket長鏈接的實現(xiàn)方法

    WebSocket是HTML5一種新的協(xié)議,它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,本篇文章介紹了iOS WebSocket長鏈接的使用,有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 詳解IOS點擊空白處隱藏鍵盤的幾種方法介紹

    詳解IOS點擊空白處隱藏鍵盤的幾種方法介紹

    本篇文章主要介紹了IOS點擊空白處隱藏鍵盤的幾種方法,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • IOS 中兩種單例模式的寫法實例詳解

    IOS 中兩種單例模式的寫法實例詳解

    這篇文章主要介紹了IOS 中兩種單例模式的寫法實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • iOS中containsString和rangeOfString的區(qū)別小結(jié)

    iOS中containsString和rangeOfString的區(qū)別小結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于iOS中containsString和rangeOfString的一些區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • IOS 禁止縮放頁面的實現(xiàn)方法

    IOS 禁止縮放頁面的實現(xiàn)方法

    這篇文章主要介紹了IOS 禁止縮放頁面的實現(xiàn)方法的相關(guān)資料,這里主要介紹了IOS 10如何通過設(shè)置來實現(xiàn)禁止縮放及實現(xiàn)方法,需要的朋友可以參考下
    2017-07-07
  • fastlane自動化打包iOS APP過程示例

    fastlane自動化打包iOS APP過程示例

    這篇文章主要為大家介紹了fastlane自動化打包iOS APP的過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • iOS開發(fā)之隨機生成兩圓之間的標準圓

    iOS開發(fā)之隨機生成兩圓之間的標準圓

    這篇文章主要給大家介紹了iOS如何實現(xiàn)在兩圓之間隨機生成標準圓的方法,實現(xiàn)的效果類似尋找附近人或者附近商家的動態(tài)效果,有需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01

最新評論

南丹县| 南川市| 和政县| 都昌县| 屏边| 阿拉尔市| 东莞市| 五峰| 固阳县| 西藏| 韶山市| 西林县| 西峡县| 汝州市| 溧水县| 三河市| 罗山县| 晋州市| 洛南县| 墨玉县| 平阳县| 子洲县| 仁化县| 靖边县| 新河县| 淳安县| 弥渡县| 杭锦后旗| 于都县| 大理市| 若羌县| 阿合奇县| 娄烦县| 咸宁市| 西畴县| 庐江县| 汶上县| 滦南县| 石柱| 台中县| 措美县|