【问题标题】:UITabBarController with viewControllers utilizing different orientations?UITabBarController 和 viewControllers 利用不同的方向?
【发布时间】:2011-03-01 20:29:18
【问题描述】:

我可以看出这是困扰很多人的事情:/

我有一个 UITabBarController,它有 4 个视图控制器,都是 UINavigationController 类型。 其中一个 navigationController 将一个 viewController 推送到它的堆栈上,这个 viewController 应该以横向模式/方向呈现。

viewController 是一个图形,它绝对是应用程序中唯一一个对景观有意义的地方。 (当它出现时我隐藏了 UITabBar,以免让用户相信这将在任何地方都有效)

要使 UITabBarController 正确响应方向的变化,它的所有 viewController 需要从委托方法返回相同的值:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

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

    return canRotate;
}

现在的“诀窍”是,当我的可横向视图控制器被推送时,我会这样做:

- (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 在堆栈上时,我可以旋转设备并且视图随之而来。

然而问题是,如果用户在横向模式下点击导航栏上的“返回”按钮,从而将 viewController 弹出到前一个 viewController,那么这个“旧”viewController 当然也处于横向模式。更糟糕的是,因为我将 BOOL 设置为 NO,当我将设备定向为纵向模式时,这个“旧”视图控制器无法旋转回来。

有没有办法更新所有内容,这样当我弹出可以处于横向模式的视图控制器时,我的其他视图控制器都不会处于横向模式?

我有点担心,如果这可以从横向到纵向完成,那么从纵向到横向也应该是可能的,从而使我的“hack”变得不必要..但如果不能,那么我又回到了原点:/

希望我很接近并且有人可以帮助我到达那里,谢谢:)

【问题讨论】:

    标签: iphone uinavigationcontroller uitabbarcontroller uiinterfaceorientation


    【解决方案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 转换,然后在需要时调用转换代码。

    【讨论】:

    • 嗨,Andiih,谢谢:) 这确实简化了很多事情。如何让导航栏也旋转?
    • 啊刚刚尝试了明显的:self.navigationController.navigationBar.transform = CGAffineTransformIdentity; self.navigationController.navigationBar.transform = CGAffineTransformMakeRotation(90.0*0.0174532925); self.navigationController.navigationBar.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 30.0f); self.navigationController.navigationBar.center = CGPointMake(160.0f, 240.0f);再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多