强制方向在 iOS 10 台设备中不起作用
Force orientation not working in iOS 10 devices
目前,当 AVPlayer 全屏按钮 pressed.I 尝试了类似的东西时,我正在强制改变方向
final class NewMoviePlayerViewController: AVPlayerViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if contentOverlayView?.bounds == UIScreen.main.bounds{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
print("full screen")
}else{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
print("half screen")
}
}
}
以上代码在 iOS 11 中工作正常,但相同的代码在 iOS 10 及以下版本中不起作用
我们终于通过以下方式修复了它...
我们在 AppDelegate 上采用了一个 Bool
变量来检测方向变化。
var isLandScapeManualCheck = Bool()
接下来我们实现了以下应用delegate
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if isLandScapeManualCheck == false{
return UIInterfaceOrientationMask.portrait
}else{
return UIInterfaceOrientationMask.landscapeRight
}
// return UIInterfaceOrientationMask.portrait
}
基于 bool 值,我们有 return out orientation 模式。
iOS 10及以下版本应该这样..
在您的播放器控制器视图中..(指您的家庭控制器)
if #available(iOS 11, *) {
}else{
playerVwController.contentOverlayView!.addObserver(self, forKeyPath: "bounds", options: NSKeyValueObservingOptions.new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "bounds"{
let rect = change![.newKey] as! NSValue
if let playerRect: CGRect = rect.cgRectValue as CGRect {
if playerRect.size == UIScreen.main.bounds.size {
print("Player in full screen")
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
isLandScapeManualCheck = true
} else {
DispatchQueue.main.async {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
print("Player not in full screen")
isLandScapeManualCheck = false
}
}
}
}
}
iOS11
之后
你应该打电话进来 viewDidLayoutSubviews
UIViewController.attemptRotationToDeviceOrientation()
所以最后你的子 class 代码如下
final class NewMoviePlayerViewController: AVPlayerViewController {
override func viewDidLayoutSubviews() {
UIViewController.attemptRotationToDeviceOrientation()
super.viewDidLayoutSubviews()
if contentOverlayView?.bounds == UIScreen.main.bounds{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
// self.contentOverlayView?.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
print("full screen")
}else{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
// self.contentOverlayView?.transform = CGAffineTransform.identity
print("half screen")
}
}
}
目前,当 AVPlayer 全屏按钮 pressed.I 尝试了类似的东西时,我正在强制改变方向
final class NewMoviePlayerViewController: AVPlayerViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if contentOverlayView?.bounds == UIScreen.main.bounds{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
print("full screen")
}else{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
print("half screen")
}
}
}
以上代码在 iOS 11 中工作正常,但相同的代码在 iOS 10 及以下版本中不起作用
我们终于通过以下方式修复了它...
我们在 AppDelegate 上采用了一个 Bool
变量来检测方向变化。
var isLandScapeManualCheck = Bool()
接下来我们实现了以下应用delegate
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if isLandScapeManualCheck == false{
return UIInterfaceOrientationMask.portrait
}else{
return UIInterfaceOrientationMask.landscapeRight
}
// return UIInterfaceOrientationMask.portrait
}
基于 bool 值,我们有 return out orientation 模式。
iOS 10及以下版本应该这样..
在您的播放器控制器视图中..(指您的家庭控制器)
if #available(iOS 11, *) {
}else{
playerVwController.contentOverlayView!.addObserver(self, forKeyPath: "bounds", options: NSKeyValueObservingOptions.new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "bounds"{
let rect = change![.newKey] as! NSValue
if let playerRect: CGRect = rect.cgRectValue as CGRect {
if playerRect.size == UIScreen.main.bounds.size {
print("Player in full screen")
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
isLandScapeManualCheck = true
} else {
DispatchQueue.main.async {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
print("Player not in full screen")
isLandScapeManualCheck = false
}
}
}
}
}
iOS11
之后你应该打电话进来 viewDidLayoutSubviews
UIViewController.attemptRotationToDeviceOrientation()
所以最后你的子 class 代码如下
final class NewMoviePlayerViewController: AVPlayerViewController {
override func viewDidLayoutSubviews() {
UIViewController.attemptRotationToDeviceOrientation()
super.viewDidLayoutSubviews()
if contentOverlayView?.bounds == UIScreen.main.bounds{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.landscapeRight.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
// self.contentOverlayView?.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
print("full screen")
}else{
DispatchQueue.main.async {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
// self.contentOverlayView?.transform = CGAffineTransform.identity
print("half screen")
}
}
}