2

我注意到大多数消费者友好的 Android 和 iPhone 健身应用程序都有两种界面模式 - 在纵向模式下,用户可以获得更详细的信息,但是当用户将设备切换到横向模式时,会添加一个全屏图形来覆盖整个屏幕。

我对如何实现到不同视图控制器的转换以响应 iPhone 上的设备旋转感兴趣。我最初的想法是拦截(willRotateToInterfaceOrientation 事件,然后获取应用委托并在窗口中添加全屏图形视图控制器)。

有没有更好的方法将 iPhone 旋转转换为另一个视图控制器?就像隐藏状态栏并在带有动画的横向模式下推送模态视图控制器?

4

3 回答 3

3

首先问问自己是否真的需要一个单独的视图控制器。一个视图控制器可以轻松隐藏或取消隐藏图形。如果此图需要自己的视图控制器,那么您可以使用包含引用其自己的视图控制器的图的容器视图。这就是容器视图的用途。然后,“主”视图控制器将隐藏和取消隐藏容器视图以响应旋转事件(并相应地对其进行布局等。)

如果您更喜欢在其超级视图中添加或删除容器视图(很可能是从“主”视图控制器的角度来看的 self.view),那么就这样做而不是隐藏和取消隐藏。这可能是最合适的。

这种方法的好处是,无论您处于何种导航结构,无论旋转的视图控制器是被推送还是以模态方式呈现,无论您是在标签栏驱动的应用程序还是单视图应用程序中,它都可以工作,无论是您正在使用情节提要,与 IB 以及以编程方式合作,等等。pp。

从应用程序的委托中获取窗口实例没有任何问题。我只是不认为有必要这样做。与替代方案相比,对我来说似乎相当复杂。

于 2013-05-22T14:04:56.940 回答
1

willRotateToInterfaceOrientation方法效果很好。

除了切换视图之外,您可能还想做另外两件有用的事情:

1)隐藏/显示状态栏。(我喜欢把它藏在风景里)

[[UIApplication sharedApplication] setStatusBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation)  withAnimation:UIStatusBarAnimationSlide];

2) 隐藏/显示任何 UINavigationBar。(也许你的风景会受益于额外的高度)

[self.navigationController setNavigationBarHidden:UIInterfaceOrientationIsLandscape(toInterfaceOrientation) animated:YES];
于 2013-05-22T13:59:42.363 回答
0

您可以拥有一个具有 willRotateToInterfaceOrientation 方法的视图控制器,并且该视图控制器具有另外两个视图控制器作为变量。

一旦设备旋转,您切换视图控制器的视图(非常粗略的代码示例:)

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {

if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) {
    [self.secondViewController.view removeFromSuperView];
    self.firstViewController.view.frame = self.bounds;
    [self.view addSubView:self.firstViewController.view];
  } else {
    [self.firstViewController.view removeFromSuperView];
    self.secondViewController.view.frame = self.bounds;
    [self.view addSubView:self.secondViewController.view];
  }
}
于 2013-05-22T13:41:57.337 回答