gpt4 book ai didi

ios - 在 iOS 9 中强制 View Controller 方向

转载 作者:可可西里 更新时间:2023-11-01 03:51:07 24 4
gpt4 key购买 nike

我正在开发一款可以拍摄人像或风景照片的应用程序。由于项目需要,我不能让设备方向自动旋转,但需要支持旋转。

当使用以下定位方法时:

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。 (而且非常脏)

我遗漏了什么吗?我已经研究过关闭和启动一个新的 View Controller ,但这还有其他问题,例如在关闭并立即呈现一个新 View 时出现持续的 UI 故障 Controller 。

编辑:

以下方法对我不起作用:

编辑 2:

对潜在解决方案的思考:

  1. 直接设置方向(使用 setValue)并处理这在 iOS 9 上出现的所有副作用( Not Acceptable )

  2. 我可以使用当前解决方案并指示用户需要旋转设备。物理旋转设备后,UI 会旋转,然后正确锁定到位。 (糟糕的用户界面)

  3. 我可以找到一种解决方案,无需物理操作即可强制刷新方向和旋转。 (我正在询问和寻找的内容)

  4. 全部手工完成。我可以将界面锁定为纵向或横向,并手动旋转和调整容器 View 的大小。这是“脏”的,因为它放弃了所有大小类自动布局功能并导致代码更重。我正在努力避免这种情况。

最佳答案

我能够借助这个答案找到解决方案:Programmatic interface orientation change not working for iOS

我的基本定位逻辑如下:

// Local variable to tracking allowed orientation. I have specific landscape and
// portrait targets and did not want to remember which I was supporting
enum MyOrientations {
case Landscape
case Portrait
}
var orientation: MyOrientations = .Landscape

// MARK: - Orientation Methods

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
}
}

// Called on region and delegate setters
func refreshOrientation() {
if let newOrientation = self.delegate?.getOrientation() {
self.orientation = newOrientation
}
}

然后当我想刷新方向时,我执行以下操作:

// Correct Orientation
let oldOrientation = self.orientation
self.refreshOrientation()
if self.orientation != oldOrientation {
dispatch_async(dispatch_get_main_queue(), {
self.orientationRefreshing = true

let vc = UIViewController()

UIViewController.attemptRotationToDeviceOrientation()

self.presentViewController(vc, animated: false, completion: nil)

UIView.animateWithDuration(0.3, animations: {
vc.dismissViewControllerAnimated(false, completion: nil)
})
})
}

此解决方案具有导致 view[Will/Did]Appearview[Will/Did]Disappear 同时触发的副作用。我正在使用本地 orientationRefreshing 变量来管理再次调用这些方法的哪些方面。

关于ios - 在 iOS 9 中强制 View Controller 方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886075/

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