我的应用程序有一个拆分的主从界面:当用户点击屏幕细节侧的特定按钮时,我使用 aUIModalTransitionStyleFlipHorizontal
modalTransitionStyle
这样我就可以模态地呈现一个新控制器并让它看起来好像细节面板已经“翻转” "到新界面。
虽然这在 iPhone 上运行良好,但当我在 iPad 上尝试时,新的模态控制器从屏幕的细节侧翻转,但在动画结束时,它覆盖了整个屏幕。
如何使控制器仅在屏幕的详细信息侧翻转?
我的应用程序有一个拆分的主从界面:当用户点击屏幕细节侧的特定按钮时,我使用 aUIModalTransitionStyleFlipHorizontal
modalTransitionStyle
这样我就可以模态地呈现一个新控制器并让它看起来好像细节面板已经“翻转” "到新界面。
虽然这在 iPhone 上运行良好,但当我在 iPad 上尝试时,新的模态控制器从屏幕的细节侧翻转,但在动画结束时,它覆盖了整个屏幕。
如何使控制器仅在屏幕的详细信息侧翻转?
如果您还没有弄清楚这一点,那么您已经完成了大部分工作。您需要为“当前上下文”定义模态视图的表示上下文,以便它只在详细视图中运行,而不是在整个超级视图中运行。
最简单的方法是在情节提要中使用 segue 设置视图。在 IB 中,创建新的视图控制器,添加一个 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];
好起来。
对我来说有 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];
你会做相反的事情来删除它。
我的问题是我从一个常规的控制器中呈现控制器UIViewController
,但我应该从拆分视图控制器中呈现它。