在ios 11中切换任务时出现虚假旋转事件

在ios 11中切换任务时出现虚假旋转事件,ios,objective-c,ipad,Ios,Objective C,Ipad,当你在iPad上使用4个手指的任务切换手势离开我的应用程序后返回时,我的应用程序正在崩溃 当用户做出4个手指的手势从我的应用程序切换出去时,我会在我的应用程序代理中看到applicationWillResignActive:然后applicationidentinterbackground:,然后(假设我们当前处于纵向)我的顶级视图控制器获取ViewWillTransitionOnSize:withTransitionCoordinator:,其大小指示横向布局(即使设备未旋转)。这当然会导致为

当你在iPad上使用4个手指的任务切换手势离开我的应用程序后返回时,我的应用程序正在崩溃

当用户做出4个手指的手势从我的应用程序切换出去时,我会在我的应用程序代理中看到
applicationWillResignActive:
然后
applicationidentinterbackground:
,然后(假设我们当前处于纵向)我的顶级视图控制器获取
ViewWillTransitionOnSize:withTransitionCoordinator:
,其大小指示横向布局(即使设备未旋转)。这当然会导致为新方向调整视图的大小和重新排列视图。紧接着,我得到了
viewwilltransitionosize:withTransitionCoordinator:
,其大小表示纵向(设备的原始方向)。再一次,为了新的(实际上是原始的)方向,我再次检查了所有的布局

我发现,如果我等待所有这些完成,我可以整天进出我的应用程序。另一方面,如果我在进行这项不必要的工作时切换回我的应用程序,我会在一些iOS转换代码中遇到崩溃


在这一点上,我试图理解为什么我会有这些杂散的旋转事件。如果我能避免这些,我就可以避免陷入导致坠机的任何情况。它们似乎没有必要。

我想不出为什么在后台获取
viewwillTransitionOnToSize
会有用或正确,所以如果您在后台,请跳出:

if UIApplication.shared.applicationState == .background {
    return
}

不过,这感觉像是一个bug,我认为你应该向苹果报告。

事实证明,没有办法阻止向应用程序报告旋转事件。我怀疑这是一个iOS错误。但是,当应用程序状态为
UIApplicationStateBackground
时,忽略
ViewWillTransitionSize:withTransitionCoordinator:
,并在视图的
布局子视图中执行相同操作(如果存在)允许我解决此问题。

感谢您指出这一点。起初我以为我无法复制它,后来我意识到我不仅可以复制它,事实上,我在应用商店上的应用程序因为它而充满了崩溃报告!我发现了另一种情况,当用户在应用程序处于多任务状态时单击Home按钮,就会发生这种情况。再一次,当应用程序处于后台状态时,两个
视图将快速连续转换为大小
。我认为这样做的原因是,它可以在横向和纵向两个方向上对应用程序进行快照,以便在运行的应用程序列表中显示缩略图。在代码就绪以绕过背景中发生的方向更改后,在横向中退出应用程序,旋转到纵向,然后双击主页以显示正在运行的应用程序。你的屏幕截图将是错误的。我认为要真正解决这个问题,我需要弄清楚在我的旋转/布局代码中发生了什么,这些代码触发了iOS中与重叠动画相关的bug。同时,我将延迟布局,直到我的应用程序激活。如果这是原因,为什么我们不在每次应用程序后台时都获取这些事件,无论如何?比如当你点击主页按钮的时候?我不知道。我遇到的崩溃是因为填充主窗口需要在后台线程上处理数据,所以需要一点时间。IOS做快照,而我仍然在中间的一切设置。结果是iOS中的某个地方出现了崩溃。我现在做的是,当我进入背景时,用静态视图覆盖我的主窗口,当我再次激活时,将其删除。当layoutSubviews看到这个静态视图时,它不会对任何子视图进行布局,而是对那个子视图进行布局(避免崩溃)。快照捕获此静态视图。不需要其他解决方法。换句话说:如果实现
layoutSubviews
,是否调用它与是否实现
viewwilltransitionosize
无关。但这不是你所问的。我们是否应该删除我们的评论?它会更干净。就像我建议的那样,删除你所有的评论。你的回答站得住脚。评论是短暂的;我们用它们来辩论如何进行。现在辩论结束了。