ios - What are possible reasons for the page curl transition to hang at the end of the animation? -
i using uipageviewcontroller in ios app transition between view controllers. view controllers each contain skview , nothing else.
the page curl works fine, can see in gif attached. @ end of animation there strange shadow @ border of screen.
here relevant source code, requested:
this modelcontroller
import uikit class modelcontroller: nsobject, uipageviewcontrollerdatasource { var pageisanimating=false let rootviewcontroller:rootviewcontroller! var nextviewcontroller:bookpageviewcontroller? var prevviewcontroller:bookpageviewcontroller? var storyboard:uistoryboard init(rootviewcontroller:rootviewcontroller) { self.rootviewcontroller=rootviewcontroller let storyboardname = "main"; storyboard = uistoryboard(name: storyboardname, bundle: nil) super.init() nextviewcontroller = viewcontrolleratindex(1) } func preloadviewcontrollers(index: int, forward:bool, oldviewcontroller: uiviewcontroller) { if(index+1<static.bookpages.count) { print("preloading next: "+(index+1).description) if(!forward) { print("taking oldviewcontroller") nextviewcontroller = oldviewcontroller as? bookpageviewcontroller } else { nextviewcontroller = viewcontrolleratindex(index+1) } } if(index-1 >= 0) { print("preloading prev: "+(index-1).description) if(forward) { print("taking oldviewcontroller") prevviewcontroller = oldviewcontroller as? bookpageviewcontroller } else { prevviewcontroller = viewcontrolleratindex(index-1) } print("after preloading prev") } } func viewcontrolleratindex(index: int) -> bookpageviewcontroller { let viewcontroller = storyboard.instantiateviewcontrollerwithidentifier("bookpageviewcontroller") as! bookpageviewcontroller viewcontroller.bookpage = modelcontroller.static.bobostory.bookpages[index] viewcontroller.index=index viewcontroller.rootviewcontroller=rootviewcontroller viewcontroller.loadresources() return viewcontroller } func pageviewcontroller(pageviewcontroller: uipageviewcontroller, viewcontrollerbeforeviewcontroller viewcontroller: uiviewcontroller) -> uiviewcontroller? { print("viewcontrollerbefore") let currentindex=(viewcontroller as! bookpageviewcontroller).index if pageisanimating { return nil } if (currentindex == 0) { return nil } let returnviewcontroller=prevviewcontroller prevviewcontroller=nil return returnviewcontroller } func pageviewcontroller(pageviewcontroller: uipageviewcontroller, viewcontrollerafterviewcontroller viewcontroller: uiviewcontroller) -> uiviewcontroller? { print("viewcontrollerafter") let currentindex=(viewcontroller as! bookpageviewcontroller).index if pageisanimating { return nil } if currentindex == modelcontroller.static.bobostory.bookpages.count-1 { return nil } let returnviewcontroller=nextviewcontroller nextviewcontroller=nil return returnviewcontroller } } this rootviewcontroller:
import uikit class rootviewcontroller: uiviewcontroller, uipageviewcontrollerdelegate { var pageviewcontroller: uipageviewcontroller? var recordings:[int:record]! var currentrecord=0 var nextindex:int = 0 var currentindex:int = 0 override func viewwillappear(animated: bool) { self.navigationcontroller?.setnavigationbarhidden(true, animated: animated); setscrollenabled(true) super.viewwillappear(animated); } func setviewcontrollers() { let startingviewcontroller: bookpageviewcontroller = self.modelcontroller.viewcontrolleratindex(0) let viewcontrollers: [uiviewcontroller] = [startingviewcontroller] self.pageviewcontroller!.setviewcontrollers(viewcontrollers [uiviewcontroller], direction: .forward, animated: false, completion: {done in }) } override func prepareforsegue(segue: uistoryboardsegue, sender: anyobject!) { if (segue.identifier == "roottoparentmodeviewcontroller") { let parentmodeviewcontroller = segue.destinationviewcontroller as! parentmodeviewcontroller parentmodeviewcontroller.rootviewcontroller=self } } override func viewdidload() { super.viewdidload() uiapplication.sharedapplication().setstatusbarhidden(false, withanimation: uistatusbaranimation.none) recordings=datamanager.sharedinstance.getrecordings() // additional setup after loading view, typically nib. // configure page view controller , add child view controller. self.pageviewcontroller = uipageviewcontroller(transitionstyle: .pagecurl, navigationorientation: .horizontal, options: nil) self.pageviewcontroller!.delegate = self setviewcontrollers() self.pageviewcontroller!.datasource = self.modelcontroller self.addchildviewcontroller(self.pageviewcontroller!) self.view.addsubview(self.pageviewcontroller!.view) self.pageviewcontroller!.view.frame=self.view.bounds self.pageviewcontroller!.didmovetoparentviewcontroller(self) // add page view controller's gesture recognizers book view controller's view gestures started more easily. //self.view.gesturerecognizers = self.pageviewcontroller!.gesturerecognizers self.view.gesturerecognizers = self.pageviewcontroller!.gesturerecognizers // find tap gesture recognizer can remove it! recognizer in self.pageviewcontroller!.gesturerecognizers { if ( recognizer uitapgesturerecognizer ) { self.view.removegesturerecognizer(recognizer) self.pageviewcontroller?.view.removegesturerecognizer(recognizer) break; } } } func reloadrecordings() { recordings=datamanager.sharedinstance.getrecordings() setviewcontrollers() } func setscrollenabled(enabled:bool) { recognizer in self.pageviewcontroller!.gesturerecognizers { if(recognizer uipangesturerecognizer) { (recognizer as! uipangesturerecognizer).enabled=enabled } } } func getcurrentrecord() -> int { return currentrecord } func getcurrentlanguage() -> record.recordlanguage { return recordings[currentrecord]!.language } override func didreceivememorywarning() { super.didreceivememorywarning() // dispose of resources can recreated. } var modelcontroller: modelcontroller { // return model controller object, creating if necessary. // in more complex implementations, model controller may passed view controller. if _modelcontroller == nil { _modelcontroller = modelcontroller(rootviewcontroller: self) } return _modelcontroller! } var _modelcontroller: modelcontroller? = nil // mark: - uipageviewcontroller delegate methods func pageviewcontroller(pageviewcontroller: uipageviewcontroller, spinelocationforinterfaceorientation orientation: uiinterfaceorientation) -> uipageviewcontrollerspinelocation { return .min } func pageviewcontroller(pageviewcontroller: uipageviewcontroller, willtransitiontoviewcontrollers pendingviewcontrollers: [uiviewcontroller]) { print("willtransitiontoviewcontroller") self.modelcontroller.pageisanimating=true self.nextindex=(pendingviewcontrollers.first as! bookpageviewcontroller).index! } func pageviewcontroller(pageviewcontroller: uipageviewcontroller, didfinishanimating finished: bool, previousviewcontrollers: [uiviewcontroller], transitioncompleted completed: bool) { if(finished) { self.modelcontroller.pageisanimating=false } if (completed){ var forward=false if(self.currentindex<self.nextindex) { forward=true } self.currentindex=self.nextindex dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_low, 0), { self.modelcontroller.preloadviewcontrollers(self.currentindex, forward: forward, oldviewcontroller: previousviewcontrollers[0]) }); }// turn either finished or aborted print("didfinishanimating") } override func prefersstatusbarhidden() -> bool { return true } } and view controller shown pageviewcontroller:
import uikit import spritekit class bookpageviewcontroller: uiviewcontroller { var bookpage:bookpage? var index:int? var rootviewcontroller:rootviewcontroller? @iboutlet var mainview: skview! var scene:bookpageskscene? var storyimagespritenode:skspritenode? var flagspritenodes=[int:skspritenode]() required init?(coder adecoder: nscoder) { super.init(coder: adecoder) } func loadresources() { print("loadresources: "+index!.description) storyimagespritenode = skspritenode(imagenamed: bookpage!.pageimage) (id, record) in rootviewcontroller!.recordings { flagspritenodes[id]=skspritenode(texture: sktexture(image: record.getrecordimage()!)) } } override func viewdidload() { super.viewdidload() print("viewdidload: "+index!.description) scene=bookpageskscene(bookpage: bookpage!, size: self.mainview.frame.size, parentviewcontroller: rootviewcontroller!, storyimagespritenode: storyimagespritenode!, flagspritenodes: flagspritenodes); /* set scale mode scale fit window */ scene!.scalemode = .resizefill scene!.backgroundcolor = skcolor.whitecolor(); // configure view. mainview.showsfps = false mainview.showsnodecount = false /* sprite kit applies additional optimizations improve rendering performance */ mainview.ignoressiblingorder = true mainview.presentscene(scene) } override func shouldautorotate() -> bool { return true } override func prefersstatusbarhidden() -> bool { return true; } override func didreceivememorywarning() { super.didreceivememorywarning() // release cached data, images, etc aren't in use. } }
one of possible reasons page curl animation hang @ end of animation in uipageviewcontroller be:
if doing heavy calculation in viewdidload() function of uiviewcontrollers, if passing data uiwebview or html string uitextview/uilabel in viewdidload() function.. move heavy calculation viewdidappear() function. maybe you. happy coding!
ReplyDeleteNice blog! Thanks for sharing this valuable information
Angularjs Training in hyderabad
Angularjs Training in Gurgaon