如何在SplitView控制器中隐藏和取消隐藏主视图控制器

use*_*195 21 iphone customization ipad uisplitviewcontroller ios5

我在XCode 4.2中创建了一个新的基于拆分视图的项目

然后在DetailViewController.m文件中我添加了这个方法

- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{
  //This method is only available in iOS5  

   return NO;
}
Run Code Online (Sandbox Code Playgroud)

现在通过这样做,我可以一次显示我的splitview控制器的左右两部分.

现在我已经UIBarButtonItem在我的DetailViewController导航栏中添加了一个,我希望通过使用它可以在Portrairt和Landscape模式中隐藏和显示我的主视图.

- (IBAction)hideUnhide:(id)sender 
{

//How can hide & unhide

}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Phi*_*Fry 9

instead spv.delegate=nil; spv.delegate=self;
Run Code Online (Sandbox Code Playgroud)

你需要做下一个:

[spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
Run Code Online (Sandbox Code Playgroud)

  • 虽然仍然不要忘记调用`splitViewController.view.setNeedsLayout`,只是调用`willRotateToInterfaceOrientation`似乎没有使用 (2认同)

And*_*jov 7

'setNeedsLayout'使UISplitViewController要求"shouldHideViewController"

- (IBAction)hideUnhide:(id)sender  {
    UISplitViewController* spv = ...;

    self.hideMaster= !self.hideMaster;
    [ spv.view setNeedsLayout ]
}
Run Code Online (Sandbox Code Playgroud)

  • 似乎SplitViewController(SVC)在委托上使用shouldHideViewController的方式在5.1中已经改变.现在,当您设置委托时,SVC会调用带有所有可能方向的onHideViewController(并且它不会再次执行).因此,如果你想"告知"shouldHideViewController"改变它的想法",它就不足以在SVC.view上使用setNeedsLayout.您必须更改SVC上的委托值.注意:它不足以"重新分配"委托给自己.似乎SVC检查委托是否实际上与当前分配的不同. (7认同)

Man*_*nni 6

在iOS 5.1中,您必须这样做:

DetailViewController.m

- (IBAction)hideUnhide:(id)sender  {
    UISplitViewController* spv = ...;

    self.hideMaster= !self.hideMaster;

    [spv.view setNeedsLayout];
    spv.delegate = nil;
    spv.delegate = self;
}

- (BOOL)splitViewController:(UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    return self.hideMaster;
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,刚刚在iOS 6 beta 3上尝试过,它无效. (4认同)

mac*_*rth 0

好吧,你的问题最简单的部分是使用 bool,比如属性 hideMaster,然后

- (IBAction)hideUnhide:(id)sender 
{

   self.hideMaster= !self.hideMaster;

}
Run Code Online (Sandbox Code Playgroud)

进而...

- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{
  //This method is only available in iOS5  

   return self.hideMaster;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但 shouldHideViewController 仅在 splitVC 重绘期间(例如在旋转期间)被调用,因此 master 仅隐藏/取消隐藏。