具有主控细节控制器的模态视图控制器大小

我的应用程序有一个拆分的主细节界面:当用户点击屏幕细节一侧的特定button时,我使用UIModalTransitionStyleFlipHorizontal modalTransitionStyle以便我可以以模态方式呈现一个新的控制器,并使其显示为详细信息面板“翻转”到新的界面。

虽然这在iPhone上正常工作,但当我在iPad上试用时,新的模式控制器从屏幕的细节侧翻转,但在animation结束时,它覆盖整个屏幕。

我怎样才能让控制器只在屏幕的细节一侧翻转?

如果你还没有弄明白这一点,那么你就是这个方面的大部分。 您需要为“当前上下文”定义模态视图的表示上下文,以使其仅在详细视图中操作,而不在整个超视图中操作。

最简单的方法就是用故事板设置故事板中的视图。 在IB中,创build新的视图控制器,添加一个segue,并通过给它一个名称“flipper”来编辑segue行,将其设置为模态,将其设置为翻转并将其设置为“当前上下文”。

一旦这些属性被设置,你可以继续到视图控制器 – 但从这样的细节视图控制器启动它:

 [self performSegueWithIdentifier:@"flipper" sender:self]; 

如果你需要在代码中进行转换,它将看起来像这样:

 UIViewController *abc = [self.storyboard instantiateViewControllerWithIdentifier:@"flipper"]; [abc setModalPresentationStyle:UIModalPresentationCurrentContext]; [abc setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; [self presentViewController:abc animated:YES completion:nil]; 

好的。

我的问题是,我从一个普通的UIViewController呈现控制器,但我应该从分割视图控制器呈现它。

对我来说,有2个选项,一个正确的方式(查看animation转换)和一个黑客的方式(弄脏模式呈现一个控制器)。

首先,你可以展示你的模式视图控制器,如你所知,一个模态视图控制器接pipe了屏幕,并且是唯一可以访问的控制器,但是你可以调整它的大小,使它最终呈现在只是在屏幕上,这里的问题是它不打算resize和放错位置,而且在旋转发生时遇到问题真的很容易。 当这个控制器存在时,你也将无法与UISplitViewController的主部分进行交互。

这可以这样做,例如:

 UIViewController *detail = [[UIViewController alloc] init]; detail.modalPresentationStyle = UIModalPresentationFormSheet; detail.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; if([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ [self presentViewController:detail animated:YES completion:nil]; }else{ [self presentModalViewController:detail animated:YES]; } detail.view.superview.frame = CGRectMake(320.0, 0.0, self.view.frame.size.width - 320.0, self.view.frame.size.height); [detail release]; 

您可能需要调整视图控制器视图的超级视图的中心…这我不build议。

您的另一个解决scheme是在您的详细信息视图控制器中使用UIViewanimation交换视图和animation翻转。

要查看这将看起来如何,检查iOS的Facebook应用程序,在聊天时,您可以点击右上angular的[…]button,视图的内容翻转,您可以调整通知该人/聊天的设置。

例如,当您在详细视图控制器中点击一个button时,您可以执行以下操作:

 UIViewController *someOtherController = [...]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.8]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES]; [self.view addSubview:someOtherController.view]; [UIView commitAnimations]; 

你会做相反的删除它。