【发布时间】:2016-06-17 16:14:39
【问题描述】:
我正在开发一个摄影应用程序,该应用程序允许以纵向或横向拍摄照片。由于项目的需要,我不能让设备方向自动旋转,但需要支持旋转。
当使用以下定位方法时:
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if self.orientation == .Landscape {
return UIInterfaceOrientationMask.LandscapeRight
} else {
return UIInterfaceOrientationMask.Portrait
}
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
if self.orientation == .Landscape {
return UIInterfaceOrientation.LandscapeRight
} else {
return UIInterfaceOrientation.Portrait
}
}
我能够在启动时正确设置旋转。通过更改方向值并调用UIViewController.attemptRotationToDeviceOrientation(),我能够支持旋转到所需的新界面。 但是,这种旋转仅在用户实际移动设备时发生。我需要它自动发生。
我可以调用:UIDevice.currentDevice().setValue(targetOrientation.rawValue, forKey: "orientation") 来强制更改,但这会导致其他副作用,因为UIDevice.currentDevice().orientation 从那时起只返回 setValue。 (而且非常脏)
我有什么遗漏吗?我已经研究过关闭并启动一个新的视图控制器,但这还有其他问题,例如在关闭并立即呈现新视图时出现持续的 UI 故障控制器。
编辑:
以下方法对我不起作用:
- Trick preferredInterfaceOrientationForPresentation to fire on viewController change
- Forcing UIInterfaceOrientation changes on iPhone
编辑 2:
对潜在解决方案的思考:
直接设置方向(使用
setValue)并处理这在 iOS 9 上出现的所有副作用(不可接受)我可以使用当前解决方案并指示用户需要旋转设备。设备物理旋转后,UI 会旋转,然后正确锁定到位。 (糟糕的用户界面)
我可以找到一种解决方案,它可以强制刷新方向并在没有物理动作的情况下旋转。 (我正在询问和寻找的内容)
全部手动完成。我可以将界面锁定为纵向或横向,并手动旋转和调整容器视图的大小。这是“肮脏的”,因为它放弃了所有尺寸类自动布局功能并导致代码更重。我正在努力避免这种情况。
【问题讨论】:
-
这是一个基于 Objective-C 的答案:*.com/questions/2689598/…,但我相信 Swift 的 API 是一样的;它对你有用吗?
-
应该有,但是这些方法在 iOS 9 中已弃用。曾经存在很多解决方案,我很难找到仍然有效的解决方案。我们的需求是非常明确的,并且是有道理的,但它们与当前的设计模式略有不同(有道理)。在这种情况下,让用户选择方向是不可行的。
-
哈,现在才看到弃用,真可惜。您的 VC 是否包含在导航控制器或选项卡栏中? Korey Hinton 在这里的答案:*.com/questions/26357162/… 试图解决这个具体案例,但我还没有尝试过。
-
不,它是完全独立的。我考虑过手动旋转整个界面,但如果可能的话,我想避免这种情况。这是一个比我想要的更肮脏的解决方案。
-
我认为不清楚:您所说的“非常肮脏”是什么意思。您是否参考旋转后的边界尺寸?请用一些屏幕截图解释您的问题,以便任何人都可以帮助您。陷入“过于宽泛”的问题或“有多种解决方案”的问题的风险非常高。
标签: ios iphone uiinterfaceorientation