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

首頁 > 系統 > iOS > 正文

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

2020-07-26 02:30:45
字體:
來源:轉載
供稿:網友

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

仿真翻頁

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

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

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() }

效果像下面這樣

左右平滑翻頁

最初采用的是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)    }       })  } } 

最終效果像這樣:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线观看免费网站| 91精品久久久久久久久久入口| 久久久久久亚洲精品不卡| 欧美有码在线视频| 中文字幕在线日韩| 欧美性受xxxx黑人猛交| 精品免费在线观看| 国产精品久久一区| 日韩美女主播视频| 久久精品国亚洲| 91av免费观看91av精品在线| 中文字幕久热精品在线视频| 国产精品色午夜在线观看| 3344国产精品免费看| 中文字幕亚洲欧美一区二区三区| 亚洲色无码播放| 亚洲国产成人精品久久久国产成人一区| 久久久久久国产精品美女| 亚洲视频精品在线| 欧美在线视频导航| 国产不卡视频在线| 欧美激情视频给我| 欧美午夜片欧美片在线观看| 亚洲电影免费观看高清完整版在线| 日韩va亚洲va欧洲va国产| 欧美最猛性xxxxx免费| 丝袜美腿精品国产二区| 国产成人精品日本亚洲| 成人亲热视频网站| 欧美精品久久一区二区| 日韩在线视频观看正片免费网站| 福利二区91精品bt7086| 国产精品91在线| 精品国产老师黑色丝袜高跟鞋| 日韩视频免费大全中文字幕| 国产精品你懂得| 亚洲欧洲日产国产网站| 91精品久久久久久久| 九九九热精品免费视频观看网站| 欧美日韩精品国产| 国产精品www网站| 国产大片精品免费永久看nba| 国产欧美精品一区二区三区介绍| 亚洲欧美国产高清va在线播| 中文字幕日韩视频| 亚洲第一区中文99精品| 国产一区在线播放| 狠狠久久五月精品中文字幕| 亚洲自拍另类欧美丝袜| 日韩在线观看免费av| 欧美高清激情视频| 久久艳片www.17c.com| 日韩成人av一区| 欧美极品少妇全裸体| 久久久伊人欧美| 国产精品电影在线观看| 欧美乱人伦中文字幕在线| 欧美成人午夜激情视频| 91在线视频一区| 国产亚洲视频中文字幕视频| 欧美日韩在线观看视频小说| 欧美激情videos| 韩国三级电影久久久久久| 91久久综合亚洲鲁鲁五月天| 日韩中文av在线| 精品久久久999| 日韩免费精品视频| 国产精品青青在线观看爽香蕉| 久久天堂av综合合色| 国产精品视频免费在线观看| 日韩av网站电影| 欧美激情视频在线观看| 国产成人在线播放| 国产精品www网站| 国产精品免费一区豆花| 永久555www成人免费| 亚洲综合最新在线| 成人综合国产精品| 国产精品爽爽爽| 国产精品成人免费视频| 欧美日韩美女在线观看| 国产精品美女www爽爽爽视频| 国产欧美一区二区三区久久| 国产精品入口免费视频一| 亚洲激情在线观看| 亚洲精品自拍视频| 国产偷亚洲偷欧美偷精品| www.日韩系列| 国产精品自在线| 欧美大码xxxx| 亚洲欧美制服第一页| 亚洲天堂网在线观看| 欧美午夜性色大片在线观看| 日韩一区二区欧美| 91探花福利精品国产自产在线| 久久精品国产久精国产思思| 亚洲色图17p| 91av视频在线免费观看| 久久久天堂国产精品女人| 欧美午夜影院在线视频| www.日韩.com| 欧美成人免费一级人片100| 色久欧美在线视频观看| 97精品一区二区三区| 久久69精品久久久久久久电影好| 欧美激情在线观看| 欧美性受xxxx黑人猛交| 国产欧洲精品视频| 精品人伦一区二区三区蜜桃免费| 精品国产精品自拍| 亚洲国产精品专区久久| 亚洲iv一区二区三区| 亚洲欧美一区二区三区在线| 激情成人在线视频| 国产a级全部精品| 97精品视频在线播放| 黑人精品xxx一区一二区| 日韩中文理论片| 国产精品日韩在线观看| 色先锋资源久久综合5566| 97国产精品人人爽人人做| 中文国产亚洲喷潮| 久99九色视频在线观看| 国产视频自拍一区| 97视频在线观看视频免费视频| 亚洲欧美国产日韩天堂区| 日韩经典一区二区三区| 亚洲自拍偷拍色图| 亚洲精品在线观看www| 成人网中文字幕| 精品国产成人在线| 北条麻妃一区二区三区中文字幕| 9.1国产丝袜在线观看| 欧美亚洲成人免费| 中文字幕国产亚洲2019| 国产成人精品在线视频| 国产亚洲一级高清| 色噜噜亚洲精品中文字幕| 欧美激情aaaa| 亚洲福利视频网站| 欧美一级高清免费| 日韩小视频在线| 亚洲成人网在线观看| 国产精品第3页| 超碰精品一区二区三区乱码| 91在线视频一区| 亚洲国产精品久久久久秋霞不卡| 午夜免费在线观看精品视频| 亚洲自拍偷拍一区| 久久久免费观看视频| 国产免费观看久久黄| 韩国精品美女www爽爽爽视频| 日韩在线观看免费高清| 国产精品永久在线| 日韩欧美国产激情| 亚洲精品日韩激情在线电影| 久久青草精品视频免费观看| 亚洲一区二区国产| 最近免费中文字幕视频2019| 国产精品亚洲аv天堂网| 成人精品久久一区二区三区| 欧美午夜宅男影院在线观看| 欧美一级视频一区二区| 亚洲网站在线播放|