3

我希望我可以正确描述这种情况。在屏幕上很容易看到它,但很难用言语解释,但我会尽我所能。UISplitViewController详细视图不会调整旋转大小

我有一个固定的主视图(UITableView中)和两个细节视图,这取决于什么样细胞的法师被触摸一个UISplitViewController。每个Detail视图也是一个UITableView。我已经使用Apple的MultipleDetailViews示例的Todd Bates转换为使用故事板作为我的代码的基础(Adventures in UISplitViewController)。

我使用的故事板,所以这是在说明部分得到棘手。 Master和第一个显示的Detail视图导航控制器在故事板中作为与UISplitViewController的关系进行了连接。第二个详细导航控制器只是坐在故事板中,没有连接。

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

我的问题是,我可以告诉大家,当前未显示调整大小本身时,方向改变的细节控制器?或者一个更好的问题是如何调整刚刚显示的Detail视图以调整UISplitView的Detail部分?

我希望我有足够的细节人来帮助这个描述。

的UISplitViewControllerDelegate方法是在是应该的详细视图控制器那些呼叫转发经理类实现。下面是该方法的实现:

#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]; 
} 

我已经实现在详细视图控制器中的每一个执行以下操作:

#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; 
} 

问题是,无论是详细视图控制器都接收这些消息。我看不出他们的get反正触发...

我怎么看不到转发didRotateFromInterfaceOrientation:会导致不从自身调整显示的细节控制。从苹果公司的文档:

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

窗口对象做多与改变当前方向相关的工作。但是,它与根视图控制器一起工作,以确定是否应该发生方向更改,如果是,应该调用哪些其他方法来响应更改。如果这个控制器是一个容器,它可能依靠一个孩子来决定是否应该发生方向。

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

回答

1

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

1

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

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

    // Forward to detail view controller here: 

} 

到详细信息视图控制器是不可见的(即不是self.currentDetailController,但对方一)。

+0

我已经投票决定给你一个答案。我会尽力使这个工作,如果它的工作,我会标记为答案。谢谢! – Moebius 2012-03-13 22:12:21

+0

谢谢!如果遇到问题,请发布您的代码,我很乐意提供帮助。 – lnafziger 2012-03-13 22:44:21

+0

我意识到当我看到代码时,我应该已经在每个Detail视图控制器中实现了UISplitViewControllerDelegate。我继续这样做,但Detail视图中的协议方法未被调用。我无法发布所有的代码,但是还有一个Detail Manager类,它也实现了委托方法。我会在原始邮件中发布。 – Moebius 2012-03-14 00:39:41

相关问题