如何将我的应用限制为横向模式?

时间:2022-11-15 20:09:43

I have my iPad application created using the SplitView template. I wonder what is the best way to restrict my application to landscape mode?

我使用SplitView模板创建了我的iPad应用程序。我想知道将我的应用程序限制为横向模式的最佳方法是什么?

I have tried overriding shouldAutorotateToInterfaceOrientation: method in DetailViewController.m

我试过覆盖DetailViewController.m中的shouldAutorotateToInterfaceOrientation:方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

but 4.2 GM is still buggy and it fails to show the controller view. What other choices do I have?

但是4.2 GM仍然是错误的,它无法显示控制器视图。我还有什么其他选择?

Thanks in advance.

提前致谢。

UPDATE1

UPDATE1

  • I have already filed a bug report: Bug ID #8620135

    我已经提交了错误报告:错误ID#8620135

  • My app is almost finished and I have to find a work-arround since I don't think they are going to solve this before 4.2 officially comes out (GM is already out!)

    我的应用程序几乎已经完成,我必须找到一个工作周期,因为我认为他们不会在4.2正式发布之前解决这个问题(GM已经出局!)

    In order to recreate the bug, just use SplitView template and override above method in any of the UIViewControllers (RootViewController or DetailViewControllers)

    为了重新创建bug,只需在任何UIViewControllers(RootViewController或DetailViewControllers)中使用SplitView模板并覆盖上面的方法

UPDATE2

UPDATE2

I have found a work-around. (See UPDATE3 for the complete work-around)

我找到了解决办法。 (有关完整的解决方法,请参阅UPDATE3)

Set UISupportedInterfaceOrientations only to support Landscape , this will force the app to start in landscape mode allowing DetailViewController to start correctly(hence shown correctly)

设置UISupportedInterfaceOrientations仅支持横向,这将强制应用程序以横向模式启动,允许DetailViewController正确启动(因此显示正确)

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

But if you rotate the device, it turns Portrait mode!!!, so is still necessary to override shouldAutorotateToIntercafeOrientation: as above

但是如果你旋转设备,它会变成肖像模式!!!,所以仍然需要覆盖shouldAutorotateToIntercafeOrientation:如上所示

Discussion:

讨论:

If this wouldn't be a bug I would expect a warning or execution error, exception or something when starting the app in a orientation that is not supported by the view controller. Besides, why only DetailViewController does not show? If this would be specification, then RootViewController should also fail to load then. Don't you think? thanks for you help... ;)

如果这不是一个错误,我会期望在视图控制器不支持的方向启动应用程序时出现警告或执行错误,异常或其他问题。此外,为什么只有DetailViewController不显示?如果这是规范,那么RootViewController也应该无法加载。你不觉得吗?谢谢你的帮助...;)

UPDATE3

UPDATE3

After further tests I have realized that above work-around does not work in some cases. For example when starting the app when the device is in landscape won't work!. The real problem seems to be that in iOS4.2GM UISplitViewController needs all its controllers have all rotations to be available at its load time. So is necessary to trick him so it loads in Landscape mode and then not allow him to rotate its view controllers.

经过进一步测试后,我意识到上述解决办法在某些情况下不起作用。例如,当设备处于横向状态时启动应用程序将无法正常工作!真正的问题似乎是在iOS4.2GM中,UISplitViewController需要其所有控制器都在其加载时具有所有旋转。因此有必要欺骗他,以便在横向模式下加载,然后不允许他旋转其视图控制器。

So here is the new work-around for this annoying iBug.

所以这是烦人的iBug的新解决方案。

Step1: Set Info.plist like so:

Step1:像这样设置Info.plist:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

Step2 Set a new flag in DetailViewController.m or .h (from SplitView Template)

Step2在DetailViewController.m或.h中设置一个新标志(来自SplitView模板)

BOOL lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //WORK-ARROUND: Bug ID# 8620135.
    if (lockRotation) {
        return UIInterfaceOrientationIsLandscape(interfaceOrientation);
    }else{
        return YES;
    }
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //set NO here since this is called before shouldAutorotateToInterfaceOrientation method is called
    lockRotation = NO; //WORK-ARROUND: Bug ID# 8620135.
}
- (void)viewDidAppear:(BOOL)animated {
    //set YES as soon as possible, but after shouldAutorotateToInterfaceOrientation method was called
    lockRotation = YES; //WORK-ARROUND: Bug ID# 8620135.
    [super viewDidAppear:animated];
}

IMPORTANT NOTE: Please note that this bug only appears when the UISplitViewController is loaded and not everytime the its view appears. Hence, to see this bug make sure the app was terminated before.

重要说明:请注意,此错误仅在加载UISplitViewController时出现,而不是每次出现其视图时都会出现。因此,要查看此错误,请确保应用程序之前已终止。

4 个解决方案

#1


2  

I asked a question with a bounty of 500 that seems to be the same thing you're facing.

我问了一个500的赏金问题,这个问题看起来和你面对的一样。

From my limited experience it is much easier to make a landscape-only iPhone app than a landscape-only iPad app. I'm not sure why there is any difference, but the steps Apple says to take to make it landscape-only do not work on their own.

从我有限的经验来看,制作仅限风景的iPhone应用程序比仅使用风景的iPad应用程序要容易得多。我不确定为什么会有任何差异,但Apple说它采取的仅仅是横向的步骤并不能自行完成。

#2


1  

Try this (it works):

试试这个(它有效):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation {
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        return YES;
    }
    else 
    {
        return NO;
    }
}

#3


0  

Check out this iPhone app in landscape mode, if you haven't already. I was going to suggest simply adding UISupportedInterfaceOrientations to your Info.plist and specifying the two landscape orientations. But, apparently, this is not sufficient, according to answers to cited question.

如果您还没有横向模式,请查看此iPhone应用程序。我打算建议简单地将UISupportedInterfaceOrientations添加到Info.plist并指定两个横向方向。但是,根据引用问题的答案,显然,这还不够。

#4


0  

I believe this is a BUG, I faced this problem also. It is something to do with

我相信这是一个BUG,我也遇到了这个问题。这与某事有关

UIInterfaceOrientationLandscapeLeft

To replicate this situation:

要复制这种情况:

1) Create a new iPad project using UISplitViewController template

1)使用UISplitViewController模板创建一个新的iPad项目

2) Edit info.plist

2)编辑info.plist

Supported interface orientations
-Landscape (left home button)
-Landscape (right home button)

3) DetailViewController.m

3)DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//    return YES;
 NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft);
 return interfaceOrientation == UIInterfaceOrientationLandscapeLeft;
}

4) Run it....You will see a blank black view. and no matter how you turn. "UIInterfaceOrientationLandscapeLeft" never detected.

4)运行它....你会看到一个空白的黑色视图。无论你如何转身。从未检测到“UIInterfaceOrientationLandscapeLeft”。

By the way, nacho4d's adding BOOL check work-around is working. Thumbs UP :)

顺便说一句,nacho4d添加BOOL检查解决方案正在发挥作用。竖起大拇指 :)

#1


2  

I asked a question with a bounty of 500 that seems to be the same thing you're facing.

我问了一个500的赏金问题,这个问题看起来和你面对的一样。

From my limited experience it is much easier to make a landscape-only iPhone app than a landscape-only iPad app. I'm not sure why there is any difference, but the steps Apple says to take to make it landscape-only do not work on their own.

从我有限的经验来看,制作仅限风景的iPhone应用程序比仅使用风景的iPad应用程序要容易得多。我不确定为什么会有任何差异,但Apple说它采取的仅仅是横向的步骤并不能自行完成。

#2


1  

Try this (it works):

试试这个(它有效):

-(BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)toInterfaceOrientation {
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
        return YES;
    }
    else 
    {
        return NO;
    }
}

#3


0  

Check out this iPhone app in landscape mode, if you haven't already. I was going to suggest simply adding UISupportedInterfaceOrientations to your Info.plist and specifying the two landscape orientations. But, apparently, this is not sufficient, according to answers to cited question.

如果您还没有横向模式,请查看此iPhone应用程序。我打算建议简单地将UISupportedInterfaceOrientations添加到Info.plist并指定两个横向方向。但是,根据引用问题的答案,显然,这还不够。

#4


0  

I believe this is a BUG, I faced this problem also. It is something to do with

我相信这是一个BUG,我也遇到了这个问题。这与某事有关

UIInterfaceOrientationLandscapeLeft

To replicate this situation:

要复制这种情况:

1) Create a new iPad project using UISplitViewController template

1)使用UISplitViewController模板创建一个新的iPad项目

2) Edit info.plist

2)编辑info.plist

Supported interface orientations
-Landscape (left home button)
-Landscape (right home button)

3) DetailViewController.m

3)DetailViewController.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//    return YES;
 NSLog(@"RotateToInterface:[%d] vs LandscapeLeft[%d]", interfaceOrientation, UIInterfaceOrientationLandscapeLeft);
 return interfaceOrientation == UIInterfaceOrientationLandscapeLeft;
}

4) Run it....You will see a blank black view. and no matter how you turn. "UIInterfaceOrientationLandscapeLeft" never detected.

4)运行它....你会看到一个空白的黑色视图。无论你如何转身。从未检测到“UIInterfaceOrientationLandscapeLeft”。

By the way, nacho4d's adding BOOL check work-around is working. Thumbs UP :)

顺便说一句,nacho4d添加BOOL检查解决方案正在发挥作用。竖起大拇指 :)