3

我希望所有视图控制器只支持纵向模式,除了一个视图控制器让我们称之为“LandscapeSupportViewController”,它也应该支持横向模式。

问题是当我在横向模式下的 LandscapeSupportViewController 然后推送一个只支持纵向模式的新视图控制器时,推送的视图控制器也将处于横向模式!我怎么能强迫它成为肖像?

我看到很少有应用程序可以做到这一点,例如 Skype iPhone 应用程序,“消息”选项卡仅是纵向的 -> 然后如果您按下输入消息本身,您将获得一个支持横向的视图控制器,因为启用横向模式是有意义的用户正在聊天-> 然后如果您按下查看人员资料,则会推送一个新的视图控制器,但是是纵向的!如果你回去也会发生同样的情况,即使你来自风景,你也将被迫返回肖像......

谢谢

4

4 回答 4

1

我让学生尝试完成您想要完成的事情,经过大量研究,普遍的共识是:这是一个坏主意,需要大量(App Store 合法)黑客才能完成,但仍然没有结果太漂亮了(例如,状态栏搞砸了)。你会在 Skype 应用程序中注意到,当你进入 IM 部分,旋转到横向,然后回击时,UI “snap”,或者会立即重新加载。

这不是一个好的用户体验,我建议重新考虑你的设计,使其更符合 Apple 的建议。

于 2012-06-07T14:15:41.877 回答
1

如果我正确理解了您,您想在某些情况下更改设备方向。

[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];

使用上面的行设置您自己的方向,只需将此行放在 if 条件中。条件取决于你。

谢谢!!

于 2012-06-07T14:19:00.267 回答
1

在推送仅支持纵向的 viewController 之前编写此行 From LandscapeViewController

[appdel.navigationController.view removeFromSuperview];// This navcontroller used with rootviewcontroller
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];
[ [UIApplication sharedApplication].self.delegate.window addSubview:appdel.navigationController.view];
self.navigationController.navigationBar.hidden=NO;
于 2012-06-07T14:40:03.003 回答
1

这是一个解决方案。您可以为管理视图控制器方向的 UINavigationController 添加一个类别。请参见下面的代码:

@interface UINavigationController (MyViewOrientations)
@end

@implemetation UINavigationController (MyViewOrientations)

- (BOOL)supportLandscapeModeForViewController:(UIViewController *)controller {
    return [controller isKindOfClass:[LandscapeSupportViewController class]]
}

- (NSUInteger)supportedInterfaceOrientation {
    UIViewController *controller = [self visibleViewController];
    NSUInteger orientationMasks = UIInterfaceOrientationMaskPortrait
    if([self supportLandscapeModeForViewController:controller]) {
        orientationMasks |= UIInterfaceOrientationMaskLandscapeLeft;
        orientationMasks |= UIInterfaceOrientationMaskLandscapeRight;
    }
    return orientationMasks;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    UIViewController *controller = [self visibleViewController];
    if([self supportLandscapeModeForViewController:controller]) {
        return UIInterfaceOrientationLandscapeLeft; // Your call
    }
    else {
        return UIInterfaceOrientationPortrait;
    }
}

- (BOOL)shouldAutorotate {
    UIViewController *controller = [self visibleViewController];
    return [self supportLandscapeModeForViewController:controller];
}
@end

如果情况更复杂,不同的观点支持不同的方向。您可以在视图控制器中覆盖“supportedInterfaceOrientation”、“preferredInterfaceOrientationForPresentation”、“shouldAutorotate”,并使用“visibleViewController”委托来自 UINavigationController 类别代码的调用。

于 2013-07-21T09:16:15.157 回答