【问题标题】:How to configure SWRevealViewController/PKRevealController/etc to handle orientation and presentation changes如何配置 SWRevealViewController/PKRevealController/etc 来处理方向和显示变化
【发布时间】:2013-12-11 20:10:52
【问题描述】:

我使用SWRevealViewController (https://github.com/John-Lluch/SWRevealViewController) 来处理两个控制器之间的切换,一个“前”和一个“后”。

前控制器是UINavigationController,后控制器只是一个普通的UIViewController,显示菜单项列表。前面的UINavigationController 推送了一个名为FrontViewController 的视图控制器的实例。后面的UIViewControllerRearViewController 的一个实例。 SWRevealViewController 的实例在配置前后控制器后被设置为根视图控制器,reveal 控制器的delegate 属性设置为应用程序委托本身。

FrontViewControllerRearViewController 中,我将覆盖 shouldAutorotate 并返回 NO 以及覆盖 supportedInterfaceOrientations 并返回 UIInterfaceOrientationMaskPortrait

但是,当我旋转设备时,应用会自动旋转并进入横向显示这两个视图。

supportedInterfaceOrientations 似乎只在FrontViewController 中调用,但该值不被接受,并且设备旋转为横向。

我也不能简单地将整个应用设置为纵向,因为我确实想要支持横向(电影播放器​​等)的其他详细视图。

如何让SWRevealViewController 工作,以便我可以在控制器的某些子视图中将应用程序限制为纵向?

我还注意到演示文稿的更改也没有得到尊重。在RearViewController 中,我将覆盖prefersStatusBarHidden 以返回YES,但从未调用此方法。同样在FrontViewController 中,我将覆盖preferredStatusBarStyle 以返回UIStatusBarStyleLightContent,但也从未调用此方法。

我的 plist 中有 UIViewControllerBasedStatusBarAppearance 设置为 YES

更新:

我已尝试按照 cmets 中的建议使用 PKRevealController,但行为完全相同。完全忽略支持的方向和状态栏样式。 supportedInterfaceOrientations on FrontViewController 是唯一调用的覆盖,但不支持 UIInterfaceOrientationMaskPortrait 的返回值。

更新 2:

我认为这只是这些控件的一个限制,他们非常希望支持方向在整个应用程序中是相同的。但是我确实尝试了MFSideMenu (https://github.com/mikefrederick/MFSideMenu),它似乎可以完全按照您的预期处理不同子视图中支持的方向。不幸的是,我仍然没有状态栏的可见性和样式。

【问题讨论】:

  • 你看过PKRevealController吗? github.com/pkluz/PKRevealController
  • 我检查了它,它实际上看起来像一个更好的库,但是同样的问题仍然存在。这就像显示控制器覆盖了应用程序其余视图中的方向设置。我可能只是想让所有东西都支持 Landscape,但很高兴知道为什么会发生这种情况。

标签: ios iphone objective-c ios7


【解决方案1】:

为了在不避免 SWRevealViewController 的情况下实现这一点:在其中实现了方法 supportedInterfaceOrientations,需要对其进行编辑。我已经这样做了:

- (NSUInteger)supportedInterfaceOrientations
{
UINavigationController* frontNavigationController = (UINavigationController*)self.frontViewController;
if ([frontNavigationController.visibleViewController isKindOfClass:[VCgallery class]]) {
    return UIInterfaceOrientationMaskAll;
}
return UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown;
}

我所有的视图控制器都是纵向的,除了那些属于 VCgallery 类的,它可以是纵向和横向的。

【讨论】:

    【解决方案2】:

    最终解决方案是继承 PKRevealController 并覆盖 supportedInterfaceOrientationsshouldAutorotatepreferredInterfaceOrientationForPresentationprefersStatusBarHiddenpreferredStatusBarStyle

    虽然MFSideMenu 这样做是为了定位,但它不支持状态栏配置。我还遇到了MFSideMenu 的一个主要错误,导致我无法在我的项目中使用它。

    我让我覆盖的每个方法都根据情况从适当的控制器返回一个值。在案例方向中,我从self.frontViewController.topViewController 返回值(因为我使用的是 UINavigation 控制器)。状态栏样式和可见性来自self.frontViewControllerself.leftViewController,具体取决于当前状态。

    同样的解决方案可能也适用于 SWRevealViewController,但我更喜欢 PKRevealController 的 API 设计。

    我从一开始就认为子类化会起作用,但我认为这样一种常见的场景会在这些控件的配置中得到处理。

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2013-07-11
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多