禁用导航控制器中View Controller的旋转

use*_*772 5 rotation uinavigationcontroller viewcontroller navigationcontroller ios

首先,这不是重复.我在SO上查看了与此相关的所有问题,但这些问题对我来说都不起作用.希望这只是因为我是iOS开发的新手,但我怀疑在我的情况下这是不可能的.我附加了一个带有视图控制器的图片,我想要禁用旋转.

我已经尝试过:对我要禁用旋转的视图控制器进行子类化,并shouldAutoRotate通过将其设置为NO 来使用该方法.显然这不起作用,因为它是导航控制器,指示其视图控制器是否可以旋转.所以,我UINavigationController在故事板中继承并使用了这个类而不是默认的导航控制器.在这堂课中,我已经设定shouldAutoRotate为NO.它仍然无法正常工作.真的不知道我做错了什么.

当我使用shouldAutoRotate设置为NO的视图控制器类扩展根视图控制器时,它会禁用整个应用程序的旋转.... 这不是我想要的.我只希望为图片中圈出的视图控制器禁用旋转.

在此输入图像描述

提前致谢!

Ozg*_*hin 11

添加AppDelegate.h

@property (nonatomic , assign) bool blockRotation;
Run Code Online (Sandbox Code Playgroud)

AppDelegate.m

-(NSUInteger)application:(UIApplication *)application       supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
if (self.blockRotation) {
    return UIInterfaceOrientationMaskPortrait;
}
return UIInterfaceOrientationMaskAll;
}
Run Code Online (Sandbox Code Playgroud)

在视图控制器中,您要禁用旋转

- (void)viewDidLoad
{
 [super viewDidLoad];
    AppDelegate* shared=[UIApplication sharedApplication].delegate;
    shared.blockRotation=YES;
}

-(void)viewWillDisappear:(BOOL)animated{
  AppDelegate* shared=[UIApplication sharedApplication].delegate;
  shared.blockRotation=NO;

  }
Run Code Online (Sandbox Code Playgroud)


AT3*_*T3D 5

感谢@ozgur为我工作的修复程序.我会'投票',但显然我不够好(无论如何!)投票是否有效.无论如何,这里是Swift:

在AppDelegate.swift中:

class AppDelegate: UIResponder, UIApplicationDelegate {


var blockRotation: Bool = false

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {

    if (self.blockRotation) {
        println("supportedInterfaceOrientations - PORTRAIT")
        return Int(UIInterfaceOrientationMask.Portrait.rawValue)
    } else {
        println("supportedInterfaceOrientations - ALL")
        return Int(UIInterfaceOrientationMask.All.rawValue)
    }
}
Run Code Online (Sandbox Code Playgroud)

在要阻止旋转的ViewController中,将UIApplicationDelegate添加到您的类中......

class LoginViewController: UIViewController, UITextFieldDelegate, UIApplicationDelegate {
Run Code Online (Sandbox Code Playgroud)

然后创建对AppDelegate的引用...

var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
Run Code Online (Sandbox Code Playgroud)

在viewDidLoad中,设置appDelegate.blockRotation = true:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    appDelegate.blockRotation = true

}
Run Code Online (Sandbox Code Playgroud)

在viewWillAppear中,设置方向以强制设备进入所选方向(本例中为纵向):

override func viewWillAppear(animated: Bool) {

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

}
Run Code Online (Sandbox Code Playgroud)

然后在viewWillDisappear或prepareForSegue中,设置appDelegate.blockRotation = false:

override func viewWillDisappear(animated: Bool) {
    appDelegate.blockRotation = false
}
Run Code Online (Sandbox Code Playgroud)

在阅读本网站上的其他解决方案数小时后,这对我来说非常适合我(导航控制器中的多视图控制器)方案.再次感谢@ ozgur - 如果可以,我会投票给你答案!

快乐的小道!


Ser*_*nko 3

您必须检查根视图控制器当前顶部控制器是否允许旋转,并在supportedInterfaceOrientations方法中返回YES或NO。因此,它应该类似于根控制器中的以下代码(根据您的情况调整代码):

- (NSUInteger)supportedInterfaceOrientations
{    
    return [self.navigationController.topViewController supportedInterfaceOrientations];
}
Run Code Online (Sandbox Code Playgroud)

然后在每个视图控制器中添加支持的界面方向,例如:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}
Run Code Online (Sandbox Code Playgroud)