4

我有下一个视图控制器:

  • 第一视图控制器

  • 第二视图控制器

  • 第三视图控制器

目标是:通过 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,其他版本运行良好)。

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

在此处输入图像描述

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

当我打印 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 frame = (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 Simulator 上做了所有测试。

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

- (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;
4

2 回答 2

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;
}
于 2013-04-04T17:24:53.787 回答
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   
      }
}

方法。

于 2013-04-04T15:20:53.363 回答