UISplitViewController详细信息视图未在旋转时调整大小

时间:2012-03-12 04:50:39

标签: uitableview uinavigationcontroller uisplitviewcontroller

我希望我能正确描述这种情况。屏幕很容易在屏幕上看到,但很难用文字解释,但我会尽力而为。

我有一个带有固定主视图(UITableView)的UISplitViewController和两个Detail视图中的一个,具体取决于Master中触摸的单元格类型。每个Detail视图也是UITableView。我已经使用Todd Bates将Apple的MultipleDetailViews示例转换为使用故事板作为我的代码(Adventures in UISplitViewController)的基础。

我正在使用故事板,所以这就是解释部分变得棘手的地方。 Master和第一个显示的Detail视图导航控制器在故事板中连接为与UISplitViewController的关系。第二个详细导航控制器只是坐在故事板中,没有连接。

这是问题所在。细节#1在横向模式下处于活动状态,细节#2通过点击主控中的一行设置为活动状态。 iPad将旋转至纵向模式,这会导致细节#2在纵向模式下正确调整大小。通过点击主控中的一行,将详细信息#1设置为活动状态。细节#1与横向模式上次显示时的大小相同,它不会像应该的那样填满屏幕。

我的问题是,当方向改变时,我可以告诉当前未显示的细节控制器调整自身吗?或者更好的问题是如何调整刚刚显示的详细信息视图以填充UISplitView的Detail部分?

我希望我能够为有人提供足够的细节来描述这一点。

UISplitViewControllerDelegate方法在Manager类中实现,该类应该将这些调用转发给Detail视图控制器。这是该方法的实现:

#pragma mark - UISplitViewControllerDelegate

/* forward the message to the current detail view
 * all detail views must implement UISplitViewControllerDelegate
 */
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
    self.masterBarButtonItem = barButtonItem;
    self.masterPopoverController = pc;

    barButtonItem.title = NSLocalizedString(@"Games", @"Games");

    [self.currentDetailController.navigationItem setLeftBarButtonItem:self.masterBarButtonItem animated:YES];
}

/* forward the message to the current detail view
 * all detail views must implement UISplitViewControllerDelegate
 */
-(void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    self.masterBarButtonItem = nil;
    self.masterPopoverController = nil;

    [self.currentDetailController.navigationItem setLeftBarButtonItem:nil animated:YES];
}

我已经在每个Detail视图控制器中实现了以下内容:

#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"Games", @"Games");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
    self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    // Called when the view is shown again in the split view, invalidating the button and popover controller.
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
    self.masterPopoverController = nil;
}

问题是两个Detail视图控制器都没有收到这些消息。我无法看到它们是如何被触发的......

我没有看到如何转发didRotateFromInterfaceOrientation:将导致未显示的Detail控制器调整自身大小。来自Apple的文档:

  

当基于iOS的设备的方向发生变化时,系统会发出UIDeviceOrientationDidChangeNotification通知,让任何感兴趣的人知道发生了更改。默认情况下,UIKit框架拦截此通知并使用它自动更新您的界面方向。这意味着,除少数例外情况外,您根本不需要处理此通知。相反,您需要做的就是在视图控制器类中实现适当的方法来响应方向更改。

     

窗口对象完成了与更改当前方向相关的大部分工作。但是,它与根视图控制器一起工作以确定是否应该发生方向更改,如果是,则应调用哪些其他方法来响应更改。如果此控制器是容器,则可能依赖于孩子来决定是否应该进行定向。

     

当发生旋转时,在旋转的各个阶段调用视图控制器的方法,以使视图控制器有机会执行其他任务。您可以使用这些方法隐藏或显示视图,重新定位视图或调整视图大小,或通知应用程序的其他部分有关方向更改。因为在旋转操作期间调用了自定义方法,所以应该避免在那里执行任何耗时的操作。您还应该避免使用一组新视图替换整个视图层次结构。有更好的方法可以为不同的方向提供独特的视图,例如呈现新的视图控制器(如“创建备用横向界面”中所述)。

2 个答案:

答案 0 :(得分:1)

与splitViewController方法类似,您应转发以下调用:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];

    // Forward to detail view controller here:

}

到不可见的详细视图控制器(即NOT self.currentDetailController,但另一个)。

答案 1 :(得分:1)

我最终解决了自己的问题。在交换详细信息视图的代码中,我将要显示的视图设置为与刚显示的视图相同的大小。我还有进一步的测试,但这个解决方案看起来像赢家。