gpt4 book ai didi

ios - 在 Swift 中强制定向后恢复自动旋转

转载 作者:可可西里 更新时间:2023-11-01 01:39:38 26 4
gpt4 key购买 nike

在我的 iPhone 应用程序中,我有一个 View ,我只想以纵向模式显示。当导航到该 View 时,它应该自动以纵向 View 显示。离开时,方向应该变回原来的方向,或者,如果设备方向发生变化,则适应该方向。我可以找到有关强制定向和防止自动旋转的信息。我找不到任何关于离开该 View 后如何改回正确方向的信息

所以我的想法是

  1. 保存初始方向(存储在currentOrientation)
  2. 订阅方向更改事件以在内容锁定为纵向时跟踪方向更改(更新 currentOrientation)
  3. 离开 View 时,使用 currentOrientation 值恢复正确的方向。

编辑(代码现已删除):除了它不起作用之外,这是一种危险的方式,因为它广泛使用了不受支持的 API。


编辑:

我相信这个问题现在可以归结为以下几点:

  1. 是否有记录的、受支持的方法来强制界面方向独立于设备方向setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation") 已在 SO 和其他地方多次被推荐,但它确实似乎是不受支持的 hack。

  2. 是否有记录的、受支持的方法来将界面方向更新为设备方向?这将需要从另一个 View 中的强制界面方向“恢复”,而不必通过来回转动设备来触发自动旋转。

支持 supportedInterfaceOrientations()shouldAutorotate()。但是这些只会在设备转到该位置后锁定 interfaceOrientation。它们不能防止错误的初始方向。

类似的问题还有很多,说明这个问题的设置并不少见,但目前还没有一个令人满意的完整解决方案,使用支持的方法。

最佳答案

我有一个类似的问题,只是我需要一个 View Controller 只在横向模式下工作,另一个在纵向模式下工作。我实现这一点的方法是制作一个自定义的“根” View Controller 。然后在该 Controller 的 viewWillTransitionToSize 方法上检查方向并以非动画方式推送正确的 View Controller (因此它看起来像用户旋转)。然后在 Interface Builder 中我显式设置 View Controller 的方向属性而不是被推断。您可以通过在受限 View Controller 上仅设置横向方向,然后在纵向旋转时不执行任何操作并在受限 View Controller 上禁用自动旋转来应用此解决方案。

更新

我没有时间测试其中的任何一个,但这些只是我在针对不同的方向为不同的 VC 实现我的解决方案时使用的想法,以下的一些组合应该有望工作我不能100% 确定它是因为我几个月前做过这个,但不记得什么起作用了,什么不起作用。

首先确保您已设置约束,如屏幕截图所示。我的有 iPad 全屏和横向,因为那是我正在做的将你的更改为你需要的任何东西(可以推断出纵向和大小)。

View Controller Interface Builder

现在,在做任何其他事情之前,我会先检查一下这是否解决了问题。我需要 Root View Controller ,因为我需要一个不同的 VC 用于纵向,一个不同的 VC 用于横向。您只需要对其进行限制,以便如果它有效而不是完美的,否则您可以尝试其他一些方法,如下所述。

设置完成后,我首先会转到要限制类的 View Controller 并使用以下方法防止自动旋转:

 override func shouldAutorotate() -> Bool {
return false
}

现在,如果您这样做,因为您仅限于肖像,我猜您并不真正关心上下颠倒,因此您不需要做任何额外的事情。如果您确实想使用 viewWillTransitionToSize 方法并手动旋转。

如果仍然无法正常工作,您最终可以尝试根 Controller 方式(但我会在最后一种情况下使用它)。这是它的草图:

class VC : UIViewController { 
override func viewDidLoad () {
UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged:", name: "UIDeviceOrientationDidChangeNotification", object: nil)
// this gives you access to notifications about rotations
}
func orientationChanged(sender: NSNotification)
{
// Here check the orientation using this:
if UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation) { // Landscape }
if UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication().statusBarOrientation) { // Portrait }
// Now once only allow the portrait one to go in that conditional part of the view. If you're using a navigation controller push the vc otherwise just use presentViewController:animated:
}
}

我为 if 语句使用了不同的路径来相应地推送我想要的路径,但您可以为两者手动推送肖像,希望上述方法之一对您有所帮助。

关于ios - 在 Swift 中强制定向后恢复自动旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31195310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com