使用自定义动画时 iOS9 上的 edgesForExtendedLayout 被忽略

edgesForExtendedLayout ignored on iOS9 when using custom animation

iOS9 在使用 UIViewControllerAnimatedTransitioning 实现自定义动画时似乎忽略了目标视图控制器的 edgesForExtendedLayout,因此内容最终位于导航栏下方。知道为什么会这样吗?

我在 https://github.com/nmarkovic04/CustomAnimationTest 上托管了一个示例。 运行 它在 8.4 和 9.1 上显示出差异,但您很可能可以尝试任何其他 8.x 和 9.x 版本。

运行 XCode 7,Swift 2.0。

只需设置此:

  self.edgesForExtendedLayout = UIRectEdgeTop;

为我解决了这个问题。

ViewDidLoad 中的这个修复了它你能确认一下吗:]

self.edgesForExtendedLayout = .Top self.extendedLayoutIncludesOpaqueBars = true

我知道这很糟糕,但在 viewDidLoad() 中我解决了这个问题:

var frame = self.view.frame
frame.origin.y = 64 //The height of status bar + navigation bar
self.view.frame = frame

对我来说,第一次看到我的视图控制器时,问题就出现了,当我旋转设备时,问题就消失了。

您必须正确设置 toViewController 的框架。 transitionContext.finalFrame(for:) 会帮助你。这是我用于淡入淡出 in/out 动画的 animateTransition(using:) 函数。一行设置框架也将修复您的共享项目。

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

        if let toViewController = transitionContext.viewController(forKey: .to) {

            transitionContext.containerView.addSubview(toViewController.view)
            toViewController.view.frame = transitionContext.finalFrame(for: toViewController)
            toViewController.view.alpha = 0.0

            UIView.animate(withDuration: 0.5,
                           animations: {
                            toViewController.view.alpha = 1.0},
                           completion: { finished in
                            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)})
        }
    }