jer*_*rry 6 uiinterfaceorientation ios uideviceorientation swift
在我的 iPhone 应用程序中,我有一个我只想以纵向模式显示的视图。当导航到该视图时,它应该自动显示在纵向视图中。当导航离开时,方向应该变回原来的状态,或者,如果设备方向发生了变化,则适应它。我可以找到有关强制定向和防止自动旋转的信息。在离开该视图后,我找不到有关如何改回正确方向的任何信息。
所以我的想法是
currentOrientation)currentOrientation)currentOrientation值恢复正确的方向。编辑(现已删除代码):除了它不起作用之外,这是一种危险的方法,因为它广泛使用了不受支持的 API。
我相信这个问题现在可以归结为以下几点:
是否有记录的、受支持的方法来强制界面方向独立于设备方向?setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: "orientation")已在 SO 和其他地方多次推荐,但它确实似乎是不受支持的 hack。
是否有记录的、受支持的方式将界面方向更新为设备方向?这将需要从另一个视图中的强制界面方向“恢复”,而不必通过来回转动设备来触发自动旋转。
支持的是supportedInterfaceOrientations()和shouldAutorotate()。但是这些只会在设备转到该位置后锁定 interfaceOrientation。它们不能防止错误的初始方向。
与此类似的问题有很多,可见此问题的设置并不少见,但目前使用支持的方法还没有令人满意且完整的解决方案。
我遇到了类似的问题,只是我需要一个视图控制器仅在横向模式下工作,而另一个视图控制器在纵向模式下工作。我实现这一目标的方法是制作一个自定义的“根”视图控制器。然后在viewWillTransitionToSize该控制器的方法上检查方向并以非动画方式推动正确的视图控制器(因此对于用户来说它看起来像是旋转)。然后在 Interface Builder 中,我显式设置视图控制器的方向属性,而不是推断。您可以通过仅在受限视图控制器上设置横向方向,然后在纵向旋转上不执行任何操作并在受限视图控制器上禁用自动旋转来应用此解决方案。
更新
我还没有时间测试其中任何一个,但这些只是我在为不同方向的不同 VC 实现解决方案时使用的想法,以下一些组合应该有望工作我不能 100% 确定关于它,因为我几个月前就这样做了,但不完全记得什么有效,什么无效。
首先,确保您已设置约束,如屏幕截图所示。我的 iPad 有全屏和横向,因为这就是我正在做的,将你的更改为你需要的任何内容(可以推断纵向和尺寸)。

现在,在做其他事情之前,我会先检查一下是否解决了问题。我需要根视图控制器,因为我需要一个不同的 VC 用于纵向,一个不同的 VC 用于横向。您只需要限制它,这样如果这有效,那就完美了,否则您可以尝试其他一些方法,如下所述。
设置完成后,我将首先转到您想要限制其类并防止自动旋转的视图控制器,使用:
override func shouldAutorotate() -> Bool {
return false
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你这样做,因为你仅限于肖像,我猜你并不真正关心颠倒,所以你不需要做任何额外的事情。如果您确实想使用该viewWillTransitionToSize方法并手动旋转。
如果事情仍然不起作用,您最终可以尝试根控制器方式(但我会在最后一种情况下使用它)。这是它的草图:
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:
}
}
Run Code Online (Sandbox Code Playgroud)
我对 if 语句使用了不同的路径来相应地推送我想要的路径,但您可以只为两者手动推送肖像路径,希望上述方法之一能够帮助您。
| 归档时间: |
|
| 查看次数: |
3687 次 |
| 最近记录: |