在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换

Posted

技术标签:

【中文标题】在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换【英文标题】:Custom transition for push animation with NavigationController on iOS 9 【发布时间】:2015-09-24 10:43:57 【问题描述】:

我有一个嵌入在 UINavigationController 中的视图控制器之间的自定义推送转换,它在使用 ios 7/8 构建时工作正常,但在针对 iOS 9 SDK 构建时呈现错误的布局。

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext

  UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
  UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

  [transitionContext.containerView addSubview:toViewController.view];

  ...

然后它继续执行动画。问题是toViewController 的内容,即使它使用了右上布局指南自动布局约束,也会呈现导航栏后面的内容。

尽管如此,它在 iOS 8 上运行良好,如果我们强制重绘(例如,将应用程序发送到后台并将其带回,在顶部显示模式并关闭它等)将导致整个自动布局系统重绘自身,toViewController 的视图跳转到正确的位置(作为顶部布局指南,导航栏的 x 像素而不是设备屏幕顶部的 x 像素)。

添加

[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];

如果放入 viewDidAppear:animated 则有效,但不适用于 viewDidLoadviewWillAppear:animated。这不是一个解决方案,因为用户会在 viewDidAppear:animatedviewDidAppear:animated 发生重绘时看到视图跳跃

【问题讨论】:

【参考方案1】:

我已经通过在addSubview: 之前添加以下行来解决我的问题:

  toViewController.view.frame = [transitionContext finalFrameForViewController:toViewController];

来自 Apple 的 finalFrameForViewController: 文档

返回指定视图控制器的结束框矩形 查看。

该方法返回的矩形代表大小 转换结束时的相应视图。对于视图 在演示过程中被覆盖,此返回的值 方法可能是 CGRectZero 但它也可能是一个有效的框架 矩形。

【讨论】:

你刚刚为我节省了很多时间。非常感谢!

以上是关于在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换的主要内容,如果未能解决你的问题,请参考以下文章

IOS侧滑返回和滑动视图的之间的冲突

在 iOS 9 上使用搜索栏 [关闭]

在 iOS 9 问题上使用 Alamofire 上传带有 URL 参数的图像

在 iOS 9.1/9.2 上使用 EXC_BAD_ACCESS CODE 1 的 AppDelegate 类声明应用程序崩溃

iOS:iOS 9 上 iPad 的 TableViewCell 背景

在 iOS 9 上使用 NavigationController 进行推送动画的自定义转换