iOS 4.3用户界面方向问题,带有20个状态栏

时间:2013-03-31 13:59:10

标签: ios ios4 uiinterfaceorientation

我有下一个视图控制器:

  • FirstViewController

  • SecondViewController

  • ThirdViewController

目标是:通过SecondViewController呈现ThirdViewController。

在FirstViewController中,我使用以下方法呈现SecondViewController:

[self presentModalViewController:secondViewController animated:NO];

当加载SecondViewController时,我在-viewDidAppear:委托回调方法中提出了ThirdViewController:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self presentModalViewController:thirdViewController animated:NO];
}

因此,我认为现有视图控制器的方案已为我们所有人所知。也许代码的设计不好,但我已经制定了这个解决方案并且有下面描述的问题。

当加载ThirdViewController时,我遇到了20分的问题(但仅适用于iOS 4.3,其他版本运行良好)。

我附上了显示我的问题的文件。

enter image description here

正如你在左侧看到的那样,我有不必要的偏移量。旋转屏幕后,此问题消失。

当我打印ThirdViewController视图帧时,它显示frame =(0 0; 480 300)。也许是SecondViewControllers视图中的问题。

关于轮换。我已经在每个控制器中实现了以下这些方法:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if (interfaceOrientation==UIInterfaceOrientationLandscapeLeft || interfaceOrientation==UIInterfaceOrientationLandscapeRight)
        return YES;

    return NO;
}

(更新:)是的我现在发现了问题而且SecondViewController帧=(0 20; 300 480);但我不明白为什么。

我添加此方法以检查当前方向:

-(void) getCurrentOrientation{

    UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];

    if(orientation == UIInterfaceOrientationPortrait){
        NSLog(@"portrait");
    } else if(orientation == UIInterfaceOrientationLandscapeRight) {
        NSLog(@"LandscapeRight");
    } else if(orientation == UIInterfaceOrientationLandscapeLeft) {
        NSLog(@"LandscapeLeft");
    }
}

并在-viewDidAppear:方法中进行检查,它会显示我在shouldAutorotateToInterfaceOrientation回调中设置的当前方向是纵向而非横向模式。

此外,我发现对于iPad iOS 4.3,它的效果很好。

我在iPhone模拟器上做了所有测试。

我已将此代码添加到我的基本视图控制器,但它仍然不适用于我。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
        //Landscape orientation code

        if (IS_IPAD) {
            [self.view setFrame:CGRectMake(0, 0, 1024, 748)];
        }
        else if (IS_IPHONE) {
            [self.view setFrame:CGRectMake(0, 0, 480, 300)];
        }
        else if (IS_IPHONE_5) {
            [self.view setFrame:CGRectMake(0, 0, 568, 300)];
        }

        NSLog(@"landscape");
        NSLog(@"%@", [NSValue valueWithCGRect:self.view.frame]);

    }else {
        //portrait orientation code
        NSLog(@"portrait");
    }
}

(工作更新:)

我使用以下代码解决了这个问题:

[UIApplication sharedApplication].statusBarHidden = YES;
if (self.thirdViewController) self.thirdViewController = nil;
self.thirdViewController = [[ThirdViewController alloc] initWithNibName:@"ThirdViewController"] bundle:nil];
[self presentModalViewController:self.self.thirdViewController animated:NO];
[UIApplication sharedApplication].statusBarHidden = NO;

2 个答案:

答案 0 :(得分:1)

亚历山大,请你试试下面的代码吧。它工作在4.3(添加到SecondViewController):

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [UIApplication sharedApplication].statusBarHidden = YES;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    AMThirdViewController* th = [[AMThirdViewController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:th animated:NO];
    [UIApplication sharedApplication].statusBarHidden = NO;
}

答案 1 :(得分:0)

您的 SecondViewController 框架是(0,20; 300,480)而不是(0,0; ​​320,480),因为屏幕顶部有状态栏。因此,您可以通过设置值“none”从“属性检查器”中删除状态栏,也可以在

中自定义视图框
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
      if (UIInterfaceOrientationIsLandscape(orientation)) {
          //Landscape orientation code
      }else {
          //portrait orientation code   
      }
}

方法