支持 Landscape Orientation 的 UiViewController 将其他 View 置于 Landscape
UiViewController which supports Landscape Orientation puts other Views in Landscape
我现在搜索了一天,没有找到合适的解决方案。
我的应用程序由一个 Tab Bar Controller 和一个 Navigation Controllers 组成。
我希望所有屏幕都只有纵向,但只有一个子视图是横向。
它可以到达那里,但是当我从子视图 return 物理上保持横向时,parent 也显示为横向,尽管我只允许 .portrait找到控制器。
我已经做了:
extension UITabBarController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = selectedViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = selectedViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
// your custom logic for rotation of selected tab
get {
if let visibleVC = selectedViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}
}
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = visibleViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = visibleViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = visibleViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}
}
并在 parent 控制器中:
override var shouldAutorotate: Bool{
return true
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
return .portrait
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
return .portrait
}
当我将设备转到纵向时,视图再次以纵向显示,但我希望在取消横向 child 后立即发生这种情况,即使我不转动设备也是如此.
有什么想法吗?
谢谢!
在您的横向视图控制器中添加此代码
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .landscapeRight
}
和 ViewWillDisappear 添加这个
override func viewWillDisappear(_ animated: Bool) {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .portrait
UIView.setAnimationsEnabled(false)
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
UIView.setAnimationsEnabled(true)
UIViewController.attemptRotationToDeviceOrientation()
UIView.setAnimationsEnabled(false)
}
在 appDeledate 中添加这一行
var window: UIWindow?
var myOrientation: UIInterfaceOrientationMask = .portrait
我现在搜索了一天,没有找到合适的解决方案。 我的应用程序由一个 Tab Bar Controller 和一个 Navigation Controllers 组成。 我希望所有屏幕都只有纵向,但只有一个子视图是横向。
它可以到达那里,但是当我从子视图 return 物理上保持横向时,parent 也显示为横向,尽管我只允许 .portrait找到控制器。
我已经做了:
extension UITabBarController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = selectedViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = selectedViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
// your custom logic for rotation of selected tab
get {
if let visibleVC = selectedViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}
}
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = visibleViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = visibleViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = visibleViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}
}
并在 parent 控制器中:
override var shouldAutorotate: Bool{
return true
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
return .portrait
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask{
return .portrait
}
当我将设备转到纵向时,视图再次以纵向显示,但我希望在取消横向 child 后立即发生这种情况,即使我不转动设备也是如此.
有什么想法吗? 谢谢!
在您的横向视图控制器中添加此代码
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .landscapeRight
}
和 ViewWillDisappear 添加这个
override func viewWillDisappear(_ animated: Bool) {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.myOrientation = .portrait
UIView.setAnimationsEnabled(false)
UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
UIView.setAnimationsEnabled(true)
UIViewController.attemptRotationToDeviceOrientation()
UIView.setAnimationsEnabled(false)
}
在 appDeledate 中添加这一行
var window: UIWindow?
var myOrientation: UIInterfaceOrientationMask = .portrait