Ios 使用自定义转换时,如何处理视图控制器中的方向更改

Ios 使用自定义转换时,如何处理视图控制器中的方向更改,ios,iphone,ipad,uiviewcontroller,Ios,Iphone,Ipad,Uiviewcontroller,我有一个UIViewController作为根视图控制器,它使用自定义转换显示另一个UIViewController。当您在查看子视图控制器的同时旋转设备,然后返回到根视图控制器时,根视图控制器的图幅不会更新。我已经把范围缩小到自定义转换的存在,也就是说,如果没有自定义转换,它就可以正常工作。使用自定义转换和根视图控制器适当处理方向更改的最佳方式是什么 我在这里有一个演示项目:似乎您刚刚忘记为正在显示的视图控制器设置框架: toVC.view.frame = fromVC.view.frame

我有一个UIViewController作为根视图控制器,它使用自定义转换显示另一个UIViewController。当您在查看子视图控制器的同时旋转设备,然后返回到根视图控制器时,根视图控制器的图幅不会更新。我已经把范围缩小到自定义转换的存在,也就是说,如果没有自定义转换,它就可以正常工作。使用自定义转换和根视图控制器适当处理方向更改的最佳方式是什么


我在这里有一个演示项目:

似乎您刚刚忘记为正在显示的视图控制器设置框架:

toVC.view.frame = fromVC.view.frame
只需将这一行添加到animateTransition,使该方法如下所示:

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let fromVC = transitionContext.viewController(forKey: .from),
        let toVC = transitionContext.viewController(forKey: .to),
        let snapshot = fromVC.view.snapshotView(afterScreenUpdates: false)
        else { return }

    let containerView = transitionContext.containerView

    // you want the newly presented view to have the same frame as the old one
    toVC.view.frame = fromVC.view.frame

    containerView.addSubview(toVC.view)
    containerView.addSubview(snapshot)

    let animator = UIViewPropertyAnimator(duration: transitionDuration(using: transitionContext), curve: .easeInOut) {
        snapshot.alpha = 0.0
    }
    animator.addCompletion { _ in
        snapshot.removeFromSuperview()
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    }
    animator.startAnimation()
}

问题是你把转换写错了。对于“当前”和“驳回”,您使用的转换完全相同,没有任何更改-也就是说,您的转换不区分这是哪一个。那是错误的。在两种不同的情况下,它需要做完全相反的事情@matt它需要不同,在这两种情况下,我只想淡出“从视图控制器”以显示目标视图控制器。@rawbee您刚刚忘记设置新视图控制器的帧,请看我的回答区别在于,在两种不同的情况下,to view控制器和from view控制器是相反的。你没有考虑到这个事实。@matt,我认为它们被颠倒的事实允许转换被重复使用。i、 e.目前;from==当前显示的根目录,to==子目录,对于Disclose,from==当前显示的子目录,to==父目录。因此,在这两种情况下,转换将淡出当前显示的视图控制器。还是我误解了?