我的应用程序有一个分割的主 - 细节界面:当用户点击屏幕细节侧的特定按钮时,我使用UIModalTransitionStyleFlipHorizontal
modalTransitionStyle
,这样我就可以呈现一个新的控制器以模态方式显示,好像细节面板已“翻转”到新界面。
虽然这在iPhone上工作正常但是当我在iPad上试用时,新的模态控制器会从屏幕的细节侧翻转,但在动画结束时,它会覆盖整个屏幕。
如何让控制器仅在屏幕的细节侧翻转?
答案 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];
你会反过来删除它。