我希望我可以正确描述这种情况。在屏幕上很容易看到它,但很难用言语解释,但我会尽我所能。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框架拦截此通知并使用它自动更新界面方向。这意味着,除了少数例外,您根本不需要处理此通知。相反,您只需在视图控制器类中实施适当的方法来响应方向更改。
窗口对象做多与改变当前方向相关的工作。但是,它与根视图控制器一起工作,以确定是否应该发生方向更改,如果是,应该调用哪些其他方法来响应更改。如果这个控制器是一个容器,它可能依靠一个孩子来决定是否应该发生方向。
发生旋转时,会在旋转的各个阶段调用视图控制器的方法,以使视图控制器有机会执行其他任务。您可以使用这些方法隐藏或显示视图,重新定位视图或调整视图大小,或者通知应用程序的其他部分关于方向更改。因为您的自定义方法在循环操作期间被调用,所以您应该避免在那里执行任何耗时的操作。您还应该避免用一组新视图替换整个视图层次结构。有更好的方法可以为不同的方向提供独特的视图,例如呈现一个新的视图控制器(如“创建一个替代景观界面”中所述)。
我已经投票决定给你一个答案。我会尽力使这个工作,如果它的工作,我会标记为答案。谢谢! – Moebius 2012-03-13 22:12:21
谢谢!如果遇到问题,请发布您的代码,我很乐意提供帮助。 – lnafziger 2012-03-13 22:44:21
我意识到当我看到代码时,我应该已经在每个Detail视图控制器中实现了UISplitViewControllerDelegate。我继续这样做,但Detail视图中的协议方法未被调用。我无法发布所有的代码,但是还有一个Detail Manager类,它也实现了委托方法。我会在原始邮件中发布。 – Moebius 2012-03-14 00:39:41