ios - Make hide/unhide master view controller work in landscape the same as portrait -


i using split view controller in simple app. leaving default works fine. in other words, master view controller shows in landscape , overlays detail view controller in portrait when button pressed.

what wanted make master view controller mimic same functionality in landscape in portrait. in other words, when device in landscape, want master view controller hidden until hit button , want overlay detail view controller.

i figured best way use following code:

 - (bool)splitviewcontroller:(uisplitviewcontroller *)svc shouldhideviewcontroller:     (uiviewcontroller *)vc inorientation:(uiinterfaceorientation)orientation  {      return self.bhidemaster;  } 

this worked in hid master view controller in landscape mode. used following code make reappear:

 - (void)hideunhidepagescontroller:(id)sender  {      [uiview beginanimations:nil context:null];      [uiview setanimationduration:0.30f];       uisplitviewcontroller* spv = self.splitviewcontroller;       // change hide unhide or vica versa      self.bhidemaster= !self.bhidemaster;       // hide button if master visible      if(self.bhidemaster)      {          self.navigationitem.leftbarbuttonitem = self.pagesbarbutton;      }      else      {           self.navigationitem.leftbarbuttonitem = nil;      }       [spv.view setneedslayout];      [spv willrotatetointerfaceorientation:self.interfaceorientation duration:0];      [[self.splitviewcontroller.viewcontrollers lastobject] view].frame = self.splitviewcontroller.view.frame;      [uiview commitanimations];  } 

this worked. have 2 problems:

  1. the transition hide-to-unhide , unhide-to-hide master view controller isn't animated , stark. added animation code (see above) animates detail view controller , not master view controller. master appears , dis-appears instantly (leaving black box on disappear) until detail view controller slides over.

  2. this shows second problem. want master view controller overlap detail view controller when appears in landscape mode, leaving detail view controller is. instead, resizes detail view controller (the same way in landscape mode before started). want master view controller interact same way in portrait mode: master slides in on top of detail controller , slides out when item selected.

if solve problem 2, don't have worry problem 1. seems there should method in split view controller slide in master left (overlapping detail view controller). in portrait mode code must there. how can call same code in landscape mode?

thanks!

---------edit 1---------

i have refactored hideunhidepagescontroller , getting closer. window overlays in both portrait , landscape. there still problem if master visible on rotation. gets confused , inverts expected behavior. i'm working on it. here amended code:

 - (void)hideunhidepagescontroller:(id)sender {     // change hide unhide or vica versa     self.bmasterishidden= !self.bmasterishidden;      nsarray *controllers = self.splitviewcontroller.viewcontrollers;     uiviewcontroller *rootviewcontroller = [controllers objectatindex:0];     uiview *rootview = rootviewcontroller.view;     cgrect rootframe = rootview.frame;     if(self.bmasterishidden)     {         rootframe.origin.x -= rootframe.size.width;     }     else     {         rootframe.origin.x += rootframe.size.width;     }     [uiview beginanimations:@"hideunhideview" context:null];     rootview.frame = rootframe;     [uiview commitanimations];  } 

in ios 8.0

self.splitviewcontroller.preferreddisplaymode = uisplitviewcontrollerdisplaymodeprimaryhidden; 

to hide master view


Comments

Popular posts from this blog

php - Why I am getting the Error "Commands out of sync; you can't run this command now" -

linux - Does gcc have any options to add version info in ELF binary file? -

java - Are there any classes that implement javax.persistence.Parameter<T>? -