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

首頁 > 系統 > iOS > 正文

ios電子書翻頁效果代碼詳解

2019-10-21 18:41:49
字體:
來源:轉載
供稿:網友

近實現了一個完整的電子書閱讀器,支持txt和epub格式的電子書閱讀,其中epub支持圖文混排的方式展示。本文主要談談其中兩種翻頁效果的實現,分別為仿真翻頁和水平滑動翻頁。

仿真翻頁

最合適的方案就是使用系統提供的UIPageviewcontroller了,不過默認的UIpageviewcontroller翻頁時背面是白色的,而閱讀器通常都會有背景色或背景圖片,翻頁時用戶體驗就很糟糕,比如就像下面這樣

ios,電子書翻頁

所以接下來主要說說如何修改背面顏色以達到美觀的翻頁效果。

UIpageviewcontroller有一個屬性叫做isDoubleSided,默認為yes,也就是內容只會在單面(正面)顯示,設置為no后,內容便可以正面和背面雙面顯示,這時每翻一頁,pageview的下面兩個回調會調用兩次

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{  // 第一次回調索取背面的controller  // 第二次回調索取正面的controller}func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{  // 第一次回調索取背面的controller  // 第二次回調索取正面的controller}

所以我們可以對正面的controller進行反向截圖,并將其放在背面的controller上顯示,這樣整體翻頁效果就會很美觀了。
代碼示例

// 對輸入的controller進行反向截圖func grabViewController(viewController: DUAPageViewController) -> Void {  self.index = viewController.index  self.chapterBelong = viewController.chapterBelong  let rect = viewController.view.bounds  UIGraphicsBeginImageContextWithOptions(rect.size, true, 0.0)  let context = UIGraphicsGetCurrentContext()  let transform = CGAffineTransform(a: -1.0, b: 0.0, c: 0.0, d: 1.0, tx: rect.size.width, ty: 0.0)  context?.concatenate(transform)  viewController.view.layer.render(in: context!)  self.backImage = UIGraphicsGetImageFromCurrentImageContext()  UIGraphicsEndImageContext() }

效果像下面這樣

ios,電子書翻頁

左右平滑翻頁

最初采用的是UIpageviewcontroller的另一種翻頁模式——滾動模式。該模式蘋果在底層是用scrollView實現的。但這種模式在頁面切換時存在一些問題,由于蘋果會對相鄰的controller進行緩存,當調用open func setViewControllers(_ viewControllers: [UIViewController]?, direction: UIPageViewControllerNavigationDirection, animated: Bool, completion: ((Bool) -> Swift.Void)? = nil)方法并且動畫為true時,有時蘋果會錯誤的認為它已經有了頁面的緩存而不再執行數據源方法,從而引發一些問題,更詳細的說明可以看這篇文章,因此決定自己寫一個翻頁控件

DUATranslationController

DUATranslationController并沒有采用Scrollview的方式實現,而是基于controller容器,通過替換child controller來實現,具體來說就是當用戶點擊或者滑動時,判斷需要展示上一個頁面還是下一個頁面,然后模仿UIpageviewcontroller通過回調的方式索取controller,加入到controller容器中,并通過動畫的方式將新的controller平滑移動進入屏幕,舊的controller同時移出,如下是單擊手勢代碼示例(滑動手勢涉及和用戶交互,邏輯更復雜些,但基本思路是一致的)

@objc func handleTapGes(gesture: UITapGestureRecognizer) -> Void {  let hitPoint = gesture.location(in: gesture.view)  let curController = self.childViewControllers.first!    if hitPoint.x < gesture.view!.frame.size.width/3 {//   滑向上一個controller   let lastController = self.delegate?.translationController(translationController: self, controllerBefore: curController)   if lastController != nil {    self.delegate?.translationController(translationController: self, willTransitionTo: lastController!)    self.setViewController(viewController: lastController!, direction: .right, animated: allowAnimating, completionHandler: {(complete) in     self.delegate?.translationController(translationController: self, didFinishAnimating: complete, previousController: curController, transitionCompleted: complete)    })   }     }  if hitPoint.x > gesture.view!.frame.size.width*2/3 {//   滑向下一個controller   let nextController: UIViewController? = self.delegate?.translationController(translationController: self, controllerAfter: self.childViewControllers.first!)   if nextController != nil {    self.delegate?.translationController(translationController: self, willTransitionTo: nextController!)    self.setViewController(viewController: nextController!, direction: .left, animated: allowAnimating, completionHandler: {(complete) in     self.delegate?.translationController(translationController: self, didFinishAnimating: complete, previousController: curController, transitionCompleted: complete)    })   }     }   }// 該方法模仿UIpageviewcontroller,切換到某一個controllerfunc setViewController(viewController: UIViewController, direction: translationControllerNavigationDirection, animated: Bool, completionHandler: ((Bool) -> Void)?) -> Void {  if animated == false {   // 直接添加child controller ,略  }else {   let oldController = self.childViewControllers.first   self.addController(controller: viewController)      var newVCEndTransform: CGAffineTransform   var oldVCEndTransform: CGAffineTransform   viewController.view.transform = .identity   if direction == .left {    viewController.view.transform = CGAffineTransform(translationX: screenWidth, y: 0)    newVCEndTransform = .identity    oldController?.view.transform = .identity    oldVCEndTransform = CGAffineTransform(translationX: -screenWidth, y: 0)   }else {    viewController.view.transform = CGAffineTransform(translationX: -screenWidth, y: 0)    newVCEndTransform = .identity    oldController?.view.transform = .identity    oldVCEndTransform = CGAffineTransform(translationX: screenWidth, y: 0)   }      UIView.animate(withDuration: animationDuration, animations: {    oldController?.view.transform = oldVCEndTransform    viewController.view.transform = newVCEndTransform   }, completion: { (complete) in    if complete {     self.removeController(controller: oldController!)    }    if completionHandler != nil {     completionHandler!(complete)    }       })  } } 

最終效果像這樣:

ios,電子書翻頁


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩福利视频在线观看| 亚洲国产精品人人爽夜夜爽| 一本一本久久a久久精品综合小说| 日韩免费在线免费观看| 久久中文精品视频| 91免费欧美精品| 欧美日韩性视频在线| 在线观看国产精品淫| 在线观看精品国产视频| 精品亚洲一区二区三区在线播放| 欧美中文在线免费| 98精品在线视频| 日韩不卡在线观看| 中文字幕欧美国内| 亚洲精品一区av在线播放| 操人视频在线观看欧美| 亚洲福利视频在线| 欧美大人香蕉在线| 一区二区三区视频观看| 91在线国产电影| 国产欧美日韩免费看aⅴ视频| 欧美国产日韩中文字幕在线| 这里只有精品视频在线| 狠狠色狠狠色综合日日五| 欧美性受xxx| 国产一区二区美女视频| 亚洲综合大片69999| 97在线免费观看视频| 亚洲欧洲第一视频| 亚洲欧美国产精品专区久久| 成人www视频在线观看| 国内精品小视频在线观看| 亚洲一区二区国产| 裸体女人亚洲精品一区| 91中文在线视频| 丰满岳妇乱一区二区三区| 欧美日韩福利视频| 亚洲码在线观看| 国产丝袜一区视频在线观看| 亚洲图片欧美午夜| 欧美电影电视剧在线观看| 91沈先生作品| 91香蕉电影院| 一本色道久久88亚洲综合88| 成人在线中文字幕| 青青久久aⅴ北条麻妃| 日韩一区视频在线| 日韩av三级在线观看| 性欧美亚洲xxxx乳在线观看| 国产精品久久久久久久一区探花| 久久精品国产成人精品| 国产视频精品在线| 精品国偷自产在线视频| 亚洲精品国精品久久99热| 欧美国产精品日韩| 九九热这里只有精品免费看| 午夜精品久久久久久久99热| 国产成人在线一区二区| 88国产精品欧美一区二区三区| 日本久久亚洲电影| 日韩精品在线观看一区二区| 亚洲欧美制服另类日韩| 欧美日韩国产成人在线| 精品久久久久久中文字幕一区奶水| 国产+人+亚洲| 日韩国产精品亚洲а∨天堂免| 久久精品色欧美aⅴ一区二区| 九九视频直播综合网| 午夜欧美大片免费观看| 欧美富婆性猛交| 亚洲成年人在线播放| 久久久久久久国产精品| 97在线观看视频国产| 精品久久久久久国产91| 亚洲欧美日韩中文在线| 日韩免费在线电影| 日韩视频欧美视频| 亚洲天堂精品在线| 久久国产精品久久国产精品| 久久91超碰青草是什么| 亚洲人在线视频| 亚洲深夜福利网站| 在线免费观看羞羞视频一区二区| 国产欧美亚洲精品| 亚洲free性xxxx护士hd| 国产精品美女在线| 一区二区三区视频免费在线观看| 中文字幕欧美视频在线| 国产欧美日韩中文字幕在线| 韩国国内大量揄拍精品视频| 日韩av片免费在线观看| 久久久久久97| 亚洲欧美另类国产| 日韩性生活视频| 国产精品自产拍在线观看中文| 国内成人精品一区| 538国产精品视频一区二区| 国产又爽又黄的激情精品视频| 尤物九九久久国产精品的特点| 久久艳片www.17c.com| 亚洲午夜未删减在线观看| 国产精品草莓在线免费观看| 日韩电影中文字幕在线观看| 久久6免费高清热精品| 国产主播精品在线| 国产精品久久久精品| 欧美高清无遮挡| 欧美在线激情视频| 亚洲自拍偷拍在线| 黑人巨大精品欧美一区免费视频| 91中文字幕在线| 亚洲人成在线观| 亚洲最大av网站| 亚洲福利视频二区| 国产精品天天狠天天看| 亚洲深夜福利视频| 亚洲美女av在线| 日韩欧美在线网址| 久久夜色精品国产亚洲aⅴ| 成人国产精品久久久| 久久艳片www.17c.com| 午夜精品一区二区三区在线播放| 久久久久久亚洲精品不卡| 2019中文字幕在线观看| 国内精品久久久久影院优| 在线观看国产精品淫| 日韩精品视频三区| 日韩激情第一页| 国产午夜精品一区二区三区| 亚洲欧美综合图区| 亚洲v日韩v综合v精品v| 日韩中文字幕网址| 久久精视频免费在线久久完整在线看| 91精品国产91久久久久| 97精品国产97久久久久久| 亚洲一区久久久| 不卡中文字幕av| 亚洲第一天堂无码专区| 一道本无吗dⅴd在线播放一区| 97视频免费看| 色偷偷av亚洲男人的天堂| 亚洲bt欧美bt日本bt| 91超碰中文字幕久久精品| 国产一区二区三区高清在线观看| 欧美视频一二三| 精品久久久视频| 亚洲高清免费观看高清完整版| 成人精品一区二区三区电影黑人| 久久精品99无色码中文字幕| 日韩av一区在线观看| 国产精品亚洲自拍| 国产91在线高潮白浆在线观看| 亚洲国产精品久久精品怡红院| 欧美高清视频一区二区| 亚洲一级免费视频| 91免费的视频在线播放| 91香蕉嫩草影院入口| 97婷婷涩涩精品一区| 久久久久久久久久久免费精品| 亚洲一区av在线播放| 久久久久久久国产精品视频| 热久久99这里有精品| 日韩欧美在线观看视频| 欧美日韩性视频|