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

时间:2012-09-25 21:08:52

标签: objective-c ios cocoa-touch ipad uikit

我的应用程序有一个分割的主 - 细节界面:当用户点击屏幕细节侧的特定按钮时,我使用UIModalTransitionStyleFlipHorizontal modalTransitionStyle,这样我就可以呈现一个新的控制器以模态方式显示,好像细节面板已“翻转”到新界面。

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

如何让控制器仅在屏幕的细节侧翻转?

3 个答案:

答案 0 :(得分:4)

如果你还没想到这一点,那么你就是那里的大部分。您需要为“当前上下文”定义模式视图的表示上下文,以便它仅在详细视图中操作,而不是在整个超级视图中操作。

最简单的方法是使用segue在storyboard中设置视图。在IB中,创建新视图控制器,添加segue并编辑segue线,方法是给它命名为“flipper”,将其设置为modal,将其设置为flip,并将其显示设置为“当前上下文”。

一旦设置了这些属性,你就可以转到视图控制器 - 但是从详细视图控制器启动它,如下所示:

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

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

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

好。

答案 1 :(得分:0)

我的问题是我从常规UIViewController呈现控制器,但我本应该从分割视图控制器中呈现它。

答案 2 :(得分:0)

对我来说,有2个选项,一个正确的方式(查看动画过渡)和一个hacky方式(通过模态呈现控制器弄脏)。

首先是hacky方式,你可以呈现你的模态视图控制器,如你所知,模态视图控制器接管屏幕并且是呈现时唯一可访问的控制器,但你可以调整它以使其最终显示在只是屏幕的细节部分,这里的问题是它不是要调整大小和错位,而且在旋转发生时很容易遇到问题。此控制器存在时,您将无法与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];

您可能需要调整详细视图中心控制器视图的超视图...这个我不推荐。

您的另一个解决方案是在详细视图控制器中使用UIView动画来交换您的视图和动画以翻转。

要了解它的外观,请查看适用于iOS的Facebook应用,在聊天时,您可以点击右上方的[...]按钮,然后翻看视图的内容即可调整该人/聊天的通知设置。

例如,当您点击详细视图控制器中的按钮时,您可以执行以下操作:

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];

你会反过来删除它。