【问题标题】:iOS 7 present modal view inside UINavigationController?iOS 7 在 UINavigationController 中呈现模式视图?
【发布时间】:2013-11-21 23:04:24
【问题描述】:

我的应用是使用 UINavigationController 设置的,用于所有导航。我想使用模态转换在应用程序中呈现特定的视图控制器。问题是我想将新的 VC 嵌入导航控制器中,但只是一个视图需要使用模态动画而不是推送。

如何在 UINavigationController 内的单个视图控制器上实现此模态动画/过渡?

请记住,在此模态动画发生后,该页面上的按钮将继续按照标准 UINavigationController 推送动画工作。

【问题讨论】:

  • 忘记有类似模态的东西并做一个presentModalView。应该可以的。
  • 在 iOS 7 中,presentModalViewController 已被弃用,当我执行该方法时,它会将视图从 UINavigationController 中取出。
  • 我的意思是 [self.navigationController presentViewController:yourViewController ...]
  • 模态视图始终是全屏的,但是您可以更改演示样式。

标签: ios iphone objective-c uinavigationcontroller


【解决方案1】:
ITviewViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"vc"];
vc.modalPresentationStyle = UIModalPresentationFullScreen;
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:Nil];

用您的视图控制器名称替换伪代码。

【讨论】:

  • 这确实有效,但是它将新呈现的 VC 从 UINavigationController 中取出。我想我真正要问的是如何呈现一个与我的导航控制器分开的视图,该视图具有从屏幕底部滑动到顶部的动画,类似于标准模态转换。我需要 UINavigationBar 在这个动画之后持续存在,这样我就可以在之后继续推送新页面。
  • UIModalPresentationFullScreen 是默认设置。这不会有帮助。它与 [self presentViewController:vc animated:YES completion:Nil];
  • 帮助什么?这就是通过设置样式并呈现它来显示“模态”的方式。
  • @PeterFoti 我认为你应该先阅读这个问题。他的问题不是如何显示模态视图,而是如何在不覆盖导航栏的情况下显示模态视图。
【解决方案2】:

在 iOS7 中,这可以使用新的自定义转换 API 来实现。你可以在这里找到更多信息:http://www.objc.io/issue-5/view-controller-transitions.html

您创建一个动画控制器(交互式或其他方式),并将其传递给导航栏委托的适当方法。在您的动画控制器中,您使用 UIView 动画 API 执行自定义动画。在您的情况下,动画应该执行从底部滑动到正向动画的位置,并从位置滑动到底部以进行反向动画。如果您支持交互式动画,您甚至可以控制动画相对于手指滑动的曲线。

【讨论】:

  • 您个人有使用这个的经验吗?我很好奇,因为如果您让我知道如何针对这种情况进行编码,它将对我有所帮助。这也不适用于低于 iOS 7 的版本,对吗?
  • 是的,这是 iOS7 的新 API。您可以在此处找到有关如何实现以及新的转换 API 一般如何工作的想法:github.com/ColinEberhardt/VCTransitionsLibrary 对于 iOS6,我会说常规的推送动画可能就足够了,您肯定不会像您一样提供完整的体验在 iOS7 上。当您完成应用程序时,iOS7 用户群可能会达到 85% 以上(目前是 80%)。
  • 非常感谢!我正在考虑采用全 iOS 7 路线,但我不完全确定。当大多数用户群已经在使用它时,它确实使它更具吸引力。
  • 这取决于您计划开发多长时间以及您的目标受众是什么。当您创建一个也适用于 iOS6 的应用程序时,显然有一些吸引人的地方。但是您必须考虑增加的测试时间,解决缺少的 API、错误等问题。iOS7 本身包含错误,因此同时处理 iOS6 和 iOS7 可能会非常麻烦。祝你好运!
  • 我认为您的目标受众最有可能升级。尤其是iOS7/7.1一旦发布越狱,采用率会攀升得更高。学生也更有可能更频繁地升级他们的设备,从而拥有能够运行最新操作系统版本的设备。
【解决方案3】:

模态视图默认为全屏。您需要更改演示样式以显示导航栏

编辑:这仅适用于 iPad。对于 iPhone,您可以使用 MZformsheet 或 Kentnguyen 来获得半模态行为

MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease]; targetController.modalPresentationStyle = UIModalPresentationFormSheet; targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizo​​ntal; //过渡不重要 [自我presentModalViewController:targetController动画:YES]; targetController.view.superview.frame = CGRectMake(0,44/*导航栏的高度*/,height, width);//重要的是后面要这样做 // 这里使用全屏高度和宽度 targetController.view.superview.center = self.view.center;

【讨论】:

  • 如原问题的 cmets 中所述,presentModalViewController 已弃用。
  • @PeterFoti 他可以使用替代 API,但逻辑是一样的。
  • 他正在为 iPhone 开发,这些是 iPad API。 modalPresentationStyle 仅在以模态方式在 iPad 上呈现视图控制器时(正式)被考虑在内。
【解决方案4】:

使用此行不是显示的modelviewcontroller

[self presentViewController:vc animated:YES completion:Nil];  

【讨论】:

    【解决方案5】:

    也许这样的东西对你有用(自己是 UINavigationController):

    - (void)verticalPushViewController:(UIViewController *)controller
    {
        [UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
        CATransition* transition = [CATransition animation];
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
        transition.duration = 0.3;
        transition.type = kCATransitionMoveIn;
        transition.subtype = kCATransitionFromTop;
        [self.view.layer addAnimation:transition forKey:kCATransition];
        [self pushViewController:controller animated:NO];
    }
    
    - (UIViewController *)verticalPopViewController
    {
        [UIApplication sharedApplication].keyWindow.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
        CATransition* transition = [CATransition animation];
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
        transition.duration = 0.3;
        transition.type = kCATransitionPush;
        transition.subtype = kCATransitionFromBottom;
        [self.view.layer addAnimation:transition forKey:kCATransition];
        return [self popViewControllerAnimated:NO];
    }
    

    【讨论】:

      【解决方案6】:

      最简单的方法。

      呈现

      LaunchImageViewController *launchView = [self.storyboard instantiateViewControllerWithIdentifier:@"launchImage"];
      [[UIApplication sharedApplication].keyWindow addSubview:launchView.view];
      

      关闭。我在里面调用这个(LaunchImageViewController)。

      [self.view removeFromSuperview];
      

      【讨论】:

        猜你喜欢
        • 2013-10-28
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多