在 iOS 7 中触发或延迟自动旋转

Posted

技术标签:

【中文标题】在 iOS 7 中触发或延迟自动旋转【英文标题】:Trigger or Delay Auto Rotation in iOS 7 【发布时间】:2014-01-31 21:00:09 【问题描述】:

是否可以在 ios 7 中以任何方式延迟或触发自动旋转,而无需切换到新的视图控制器?

以 iPad 上的 Siri 为例。当 Siri 被激活时,在它后面运行的应用程序被延迟和模糊,Siri 的透明界面覆盖在上面。如果您在使用 Siri 时旋转设备,则不会发生任何事情,但在关闭 Siri 时,自动旋转事件最终会触发。

我在我的应用程序中实现了类似的模糊/延迟效果,方法是拍摄窗口快照、模糊/缩放它、将其放置在正在显示的视图的顶部,并在顶部放置额外的透明内容。因为这是一个快照,不能即时调整大小,所以我防止发生自动旋转(如 Siri),-shouldAutorotate 在视图层次结构中返回 NO 高。一旦这个状态被解除,我再次允许自动旋转,但没有触发旋转。这是因为应用处于此模糊/延迟模式时发生的旋转被忽略了。

是否可以触发自动旋转以正确旋转到设备的实际方向我从此模式返回后?

【问题讨论】:

【参考方案1】:

以下是我的三个建议:

    使用实时模糊视图并允许动画。有许多开源实现,其中大多数使用拉伸工具栏或其模糊CALayer。这将允许您支持旋转以及在模糊背景下获得实时视图(如 Siri)。 编辑: 在四处挖掘之后,我发现某些采用工具栏CALayer 的开源实现被Apple 拒绝了。通过使用工具栏并拉伸它似乎是安全的。

    拍摄关键窗口的快照后,将该快照显示为显示在关键窗口上方的另一个窗口的根视图。如果我没记错的话,没有附加视图控制器的视图在添加到窗口的视图层次结构时不会旋转。 (如果是这样,使用反变换很容易反制。)本质上,您将实现非旋转视图。但是,下面的窗口将正常旋转。关闭快照保持窗口时,将其淡出,以便将下面的视图层次结构平滑地呈现给用户。这种方法的缺点是没有实时预览模糊背景,用户看不到旋转动画。

    iOS 中的旋转基本上是视图控制器为视图设置一个变换,如果满足所有条件并确定支持界面旋转。在负责模糊视图的视图控制器中,使用反向变换进行反向旋转。这应该使视图看起来好像没有旋转。一旦需要隐藏模糊视图,请使用动画块重置变换,这将创建与旋转相同的动画。如果您将此方法与实时模糊视图相结合,这将重新创建原生 Siri 体验 1:1。您唯一的问题是状态栏将旋转而不管视图的变换,因为它从不同的系统获取变换。对此有灰色地带的补救措施。

这些建议按实施难易程度排序。每个都可以单独实现,也可以1+2、1+3或1+2+3组合实现。

【讨论】:

您是正确的,未附加到控制器的视图在作为子视图添加到窗口时不会旋转(#2 的一部分)。以这种方式实现我想要的很简单,增加了确保快照以编程方式旋转的步骤,方法是在过渡到“模糊”模式开始时根据设备当前方向设置其变换。离开“模糊”模式时的简单交叉淡入淡出确实可以使过渡变得足够平滑,不会显得突兀,这是我根据在离开此模式之前方向是否发生变化而有条件地进行的。谢谢。【参考方案2】:

Siri 遵循不同的规则。它是一个完全不同的应用程序(以及特权系统应用程序),显示在先前最前面的应用程序之上。

至于您的情况,要做的事情可能是在当前视图控制器之上呈现一个全屏模式视图控制器,该控制器仅允许当前方向。然后,当它被解雇时,前一个 VC 将再次允许轮换,一切都应该从它停止的地方开始。

【讨论】:

以上是关于在 iOS 7 中触发或延迟自动旋转的主要内容,如果未能解决你的问题,请参考以下文章

从多级延迟触发器到边沿检测

从延迟触发器链到边沿检测

MyBatis应用开发(18)延迟加载之延迟加载触发方法(lazyLoadTriggerMethods)

Google Chrome 中的 CSS 转换延迟

从多级延迟触发器到边沿检测

定时器触发 Tick 事件,延迟 15 毫秒