0

在许多情况下需要旋转控制器并且不工作。现在我遇到了问题的反面:它正在旋转,我想禁用。

在那个 ViewController 我有这个:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

但它是自动旋转的,因为不是这个 UIViewController 被问到,而是他在 UI 树中的父级。也许这就是问题所在。对于所有情况,根控制器都必须返回 Yes,因为堆栈上还有一些其他 UIViewController,它们具有 / 必须具有 Portait / Landscape 支持。

我不能/不想触摸其他部分,因为......有几个原因,例如:应用程序很大,有很多已知的错误,我不想做 1 并测试它为 1周,其他是最后期限。

请不要建议它不应该这样,必须重写。我知道。

如何处理这个控制器强制Portait?

也请阅读粗体文本:不能强制整个应用程序仅支持 1 个视图控制器的 Portait,堆栈上有很多!

4

2 回答 2

2

尝试在属性文件中将应用程序支持的界面方向标记为仅纵向。但是当然,在该函数中,您只需在要允许旋转的视图控制器上返回 YES 即可。但是当你将它推回堆栈时,其他视图应该是纵向的。

仅纵向方向

于 2012-09-05T18:03:20.053 回答
1

检测Landscape旋转并旋转到Portait:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{ 

    UIInterfaceOrientation appOrientation = [UIApplication sharedApplication].statusBarOrientation;
    float width = self.view.bounds.size.width;
    float height = self.view.bounds.size.height;
    //NSLog(@"width %3.0f, height: %3.0f", width, height);

    if((fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)){
        // if is rotated from Portait:
        if((appOrientation == UIInterfaceOrientationLandscapeLeft || appOrientation == UIInterfaceOrientationLandscapeRight)){
            // to Landscape:
            CGAffineTransform transform = self.view.transform;
            transform = CGAffineTransformRotate(transform, -(M_PI / 2.0));
            self.view.transform = transform;            

            [self.view setBounds:CGRectMake(0, 0, height, width)];
        }
    }
    else {
        // it is rotated from Landscape:
        if((appOrientation == UIInterfaceOrientationPortrait || appOrientation == UIInterfaceOrientationPortraitUpsideDown)){
            // to Portrait:            
            CGAffineTransform transform = self.view.transform;
            transform = CGAffineTransformRotate(transform, +(M_PI / 2.0));
            self.view.transform = transform;            

            [self.view setBounds:CGRectMake(0, 0, height, width)];
        }
    } 
}

它不是最好的编程范式,但它可以解决问题。

有人写类似tis来接受他的答案,或者写一个更好的方法,如果可以的话!

于 2012-09-07T13:03:25.877 回答