2

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

我有一个具有 4 个视图控制器的 UITabBarController,所有类型均为 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,当我将设备定向为纵向模式时,这个“旧”视图控制器无法旋转回来。

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

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

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

4

1 回答 1

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

于 2010-06-09T21:59:02.493 回答