gpt4 book ai didi

ios - 以编程方式更改方向不起作用

转载 作者:可可西里 更新时间:2023-11-01 02:16:29 26 4
gpt4 key购买 nike

我的整个应用程序都处于 portrait 模式。我只想在 landscape 模式下使用一个 View Controller (左)。

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask 
{
if let _navigationController = window?.rootViewController as? UINavigationController {

if _navigationController.topViewController is FullScreenPlayerVC {

return UIInterfaceOrientationMask.LandscapeLeft
}
}

return UIInterfaceOrientationMask.Portrait
}

这是我的 Controller A

override func shouldAutorotate() -> Bool
{
return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask
{
return UIInterfaceOrientationMask.Portrait
}

现在我按下 Controller B。这是我的 Controller B

override func viewDidAppear(animated: Bool)
{
super.viewDidAppear(animated)

let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
}

override func shouldAutorotate() -> Bool
{
return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask
{
return UIInterfaceOrientationMask.Landscape
}

当我在纵向模式下握住我的设备时按下 Controller B 但如果我已经在横向模式下握住我的手机时,它会按照我的要求工作。

它没有执行所需的操作。搜索了很多关于它但无法找到解决方案。

我已经尝试了很多解决方案,但没有任何效果。

最佳答案

这是针对您的问题和其他相关问题的通用解决方案。

<强>1。创建辅助类 UIHelper 并放置以下方法:

    /**This method returns top view controller in application  */
class func topViewController() -> UIViewController?
{
let helper = UIHelper()
return helper.topViewControllerWithRootViewController(rootViewController: UIApplication.shared.keyWindow?.rootViewController)
}

/**This is a recursive method to select the top View Controller in a app, either with TabBarController or not */
private func topViewControllerWithRootViewController(rootViewController:UIViewController?) -> UIViewController?
{
if(rootViewController != nil)
{
// UITabBarController
if let tabBarController = rootViewController as? UITabBarController,
let selectedViewController = tabBarController.selectedViewController {
return self.topViewControllerWithRootViewController(rootViewController: selectedViewController)
}

// UINavigationController
if let navigationController = rootViewController as? UINavigationController ,let visibleViewController = navigationController.visibleViewController {
return self.topViewControllerWithRootViewController(rootViewController: visibleViewController)
}

if ((rootViewController!.presentedViewController) != nil) {
let presentedViewController = rootViewController!.presentedViewController;
return self.topViewControllerWithRootViewController(rootViewController: presentedViewController!);
}else
{
return rootViewController
}
}

return nil
}

<强>2。根据您的期望行为创建一个协议(protocol),您的具体情况将是横向的。

协议(protocol) orientationIsOnlyLandscape{}

注意:如果需要,将其添加到 UIHelper 类的顶部。

<强>3。扩展您的 View Controller

在你的情况下:

class B_ViewController: UIViewController,orientationIsOnlyLandscape {

....

}

<强>4。在应用程序委托(delegate)类中添加此方法:

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
let presentedViewController = UIHelper.topViewController()
if presentedViewController is orientationIsOnlyLandscape {
return .landscape
}
return .portrait
}

最后的注释:

  • 如果你有更多的类(class)处于横向模式,只需扩展它协议(protocol)。
  • 如果您想要来自 View Controller 的其他行为,请创建其他协议(protocol)并遵循相同的结构。
  • 这个例子解决了推送后方向改变的问题 View Controller

关于ios - 以编程方式更改方向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37983846/

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