【问题标题】:Modal view controller size with master-detail controller带有主从控制器的模态视图控制器大小
【发布时间】:2012-09-17 10:50:33
【问题描述】:

我的应用有一个分离的主从界面:当用户点击屏幕细节侧的特定按钮时,我使用UIModalTransitionStyleFlipHorizontalmodalTransitionStyle,这样我就可以模态地呈现一个新的控制器并拥有它看起来好像详细信息面板已“翻转”到新界面。

虽然这在 iPhone 上运行良好,但当我在 iPad 上尝试时,新的模态控制器会从屏幕的细节侧翻转,但在动画结束时,它会覆盖整个屏幕。

如何使控制器仅在屏幕的详细信息侧翻转?

【问题讨论】:

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


    【解决方案1】:

    如果您还没有弄清楚这一点,那么您已经完成了大部分工作。您需要为“当前上下文”定义模态视图的表示上下文,以便它只在详细视图中运行,而不是在整个超级视图中运行。

    最简单的方法是在情节提要中使用 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】:

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

    【讨论】:

    • 抱歉,这是您的错误,您不再寻找解决方案了吗?您有一个模态视图控制器要显示在屏幕的一侧,而不是详细信息?仅对细节进行动画处理?我不确定您是否正在寻找解决方案,但请查看我的答案。我可以看到你在这个答案之后提出了赏金,所以我假设你还没有设法得到你想要的东西。
    • 对我有用的实际答案在这里:stackoverflow.com/a/12763120/126855
    • 哦酷,没看到那个答案,这也是我在回答中解释的。
    【解决方案3】:

    对我来说有 2 个选项,一个正确的方式(查看动画转换)和一个 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];
    

    你可以做相反的事情来删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2012-04-27
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多