UISplitViewController 一致分隔符

Posted

技术标签:

【中文标题】UISplitViewController 一致分隔符【英文标题】:UISplitViewController consistent divider 【发布时间】:2013-10-25 15:05:57 【问题描述】:

在我的 iPad 应用程序中,我使用 UISplitViewController 和两个 UINavigationController 作为主控和细节。在 Potrait 中,我希望通过 UIPopoverViewController 隐藏和访问主控。这是我的 UISplitViewController 子类的实现,效果很好:

- (id)init 
    self = [super init];
    if (self) 
        _splitViewController = [[UISplitViewController alloc] init];
        _splitViewController.delegate = self;

        _searchViewController = [[UIViewController alloc] init];
        _searchViewController.view.backgroundColor = [UIColor whiteColor];
        _masterNavController = [[UINavigationController alloc] initWithRootViewController:_searchViewController];
        _masterNavController.navigationBar.translucent = NO;

        _mapViewController = [[MapViewController_iPad alloc] init];
        _detailNavController = [[UINavigationController alloc] initWithRootViewController:_mapViewController];
        _detailNavController.navigationBar.translucent = NO;

        _splitViewController.viewControllers = @[_masterNavController, _detailNavController];
        _splitViewController.view.backgroundColor = [UIColor redColor];
    

    return self;


#pragma mark -
#pragma mark - UISplitViewControllerDelegate

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc 
    svc.view.backgroundColor = [UIColor redColor];
    barButtonItem.title = NSLocalizedString(@"ipad_search_vc_bar_button_title", @"Name of the master view controller button on iPad");
    [self.mapViewController.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];


- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
    svc.view.backgroundColor = [UIColor redColor];
    [self.mapViewController.navigationItem setLeftBarButtonItem:nil animated:YES];


- (void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController 
    svc.view.backgroundColor = [UIColor redColor];
    [pc setPopoverBackgroundViewClass:[CustomPopoverBackgroundView class]];

看起来是这样的:

第一次启动App并点击UIBarButton后,主界面如下:

在第二次隐藏并点击 UIBarButton 项目后,master 看起来应该是这样的。它有红色分隔线,而不是标准的彩色分隔线:

现在,UISplitViewController 委托中使用的 CustomBackgroundView 实际上正在被实例化,但不知何故第一次没有使用。

知道如何在第一次强制 UIPopOverController 使用 CustomBackgroundView 吗?

【问题讨论】:

我没有看到最后两张图片之间的区别 第一张图片有一个标准的彩色分隔线,第二张是红色的。 【参考方案1】:

我最终只是简单地向 UISplitViewController 的视图添加了一个子视图,它与 UINavigationBar 具有相同的颜色。

UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
[splitViewController.view addSubview:coloredView];

【讨论】:

【参考方案2】:

您的拆分视图是您的根视图控制器吗?看起来您在导航控制器中有拆分视图,这是不允许的。这将解释您的图形错误。

【讨论】:

是的,UISplitViewController 是根。它包含两个 UINavigationController 来处理 UINavigationBar

以上是关于UISplitViewController 一致分隔符的主要内容,如果未能解决你的问题,请参考以下文章

UISplitViewController - 双列样式不起作用

UISplitViewController - 并排或纵向叠加

在 UIViewControllers 和 UISplitViewController 之间导航 [关闭]

将 UIToolBar 放在 UISplitViewController 上方?

UISplitViewController + UISearchController 显示搜索细节

iPad 上的 UITraitCollection 和 UISplitViewController