UITabBarController与viewControllers使用不同的方向?

时间:2010-06-09 19:29:03

标签: iphone uinavigationcontroller uitabbarcontroller uiinterfaceorientation

我可以看到这一直困扰着很多人:/

我有一个UITabBarController,它有4个viewControllers,所有类型都是UINavigationController。 其中一个navigationControllers将viewController推入其堆栈,此viewController应以横向模式/方向呈现。

viewController是一个图形,它是应用程序中唯一一个风景有意义的地方。 (当提示UITabBar时,我隐藏UITabBar,不会让用户相信这会在任何地方都有效)

要使UITabBarController正确响应方向更改,其所有viewControllers都需要从委托方法返回相同的值:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

为了适应这种行为,我在属于UITabBarController的所有viewControllers中实现了这个方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

“诀窍”现在是当我推出可以成为风景的viewController时,我这样做:

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

当它弹出时,我这样做:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

这非常有效。当viewController在堆栈上时,我可以旋转设备并跟随视图。

问题是,如果用户在横向模式下点击navigationBar上的“后退”按钮,从而将viewController弹出到上一个viewController,这个“旧”viewController当然也处于横向模式。更糟糕的是,因为我将BOOL设置为NO,所以当我将设备定位到纵向模式时,这个“旧”viewController无法旋转。

有没有办法更新所有内容,以便当我弹出可以在风景模式中的viewController时,我的其他viewControllers都不会处于横向模式?

我有点担心,如果这可以从风景到肖像完成,它也应该可以从纵向到横向,从而使我的“黑客”不必要..但如果它不能,那么我回到正方形:/

希望我亲近,有人可以帮助我到达那里,谢谢:)

1 个答案:

答案 0 :(得分:1)

我想我可以简化整个事情....

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

-(void) viewDidAppear:(BOOL)animated { [UIView beginAnimations:@"View Flip" context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(90.0*0.0174532925);
    self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
    self.view.center = CGPointMake(160.0f, 240.0f);

// [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight;

[UIView commitAnimations];
[super viewDidAppear:animated];

}

无法自动旋转,但您可以手动旋转要移动的视图。如果视图中不需要键盘支持,则无需更改statusBarOrientation。

如果您不总是希望旋转视图,那么您会遇到一个稍微难点的问题 - 您可能需要检查加速度计值以确定手机的哪个方向(或者可能暗示手机的哪个方向)已经通过调用shouldAutotateToInterfaceOrientation来转换,然后只需在需要时调用转换代码。