如何在 iPhone 上的 UIPopoverController 中显示 NavigationController-background

Posted

技术标签:

【中文标题】如何在 iPhone 上的 UIPopoverController 中显示 NavigationController-background【英文标题】:How to display NavigationController-background within a UIPopoverController on iPhone 【发布时间】:2012-02-11 17:14:10 【问题描述】:

如何在 iPhone 上的 UIPopovercontroller 中显示 NavigationController 的背景(包括标题/按钮)?

目前看起来是这样的:

在我的 PopoverView-ViewController 中:

- (void)viewDidLoad

[super viewDidLoad];

self.navigationController.navigationBar.hidden = NO;
self.navigationController.navigationBarHidden = NO;

self.navigationItem.title = @"self.navigationItem.title";

调用 Popover 时:

InfoView *iv = [[InfoView alloc] initWithNibName:@"InfoView" bundle:nil];


    UINavigationController *uc = [[UINavigationController alloc] initWithRootViewController:iv];


    self.pop = [[UIPopoverController alloc] initWithContentViewController:uc];
    [self.pop setDelegate:self];
    [self.pop presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:true];

应该是这样的:

【问题讨论】:

@Rayfleck,你也可以在 iPhone 上使用它!!你读了问题并看图片了吗???不要为时过早。 ***.com/questions/6371508/… -- 这就是你要找的吗? @rakete - 是的,我看到了这张照片,并被它弄糊涂了。 ios 5.0 库 UIPopoverController 类参考说:Popover controllers are for use exclusively on iPad devices. Attempting to create one on other devices results in an exception. 【参考方案1】:

起初 UINavigationController 没有自己的背景,它显示内容视图控制器的背景。如果您可以成功显示带有导航控制器的弹出框,请检查您的 InfoView。它的视图有一些背景吗?

其次,我尝试在 iPhone 上以不同的配置多次执行你的代码,但总是收到错误

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[UIPopoverController initWithContentViewController:] 在 未运行时调用 UIUserInterfaceIdiomPad.

这对我来说并不意外。即使你能让它工作,Apple 也可能会拒绝你的申请。 2.1 崩溃的应用程序将被拒绝 - 只需在多台设备上测试您的代码并查看结果。

【讨论】:

我不需要内容的背景。我想显示栏的背景,其中包括导航控制器顶部的标题和按钮。你得到这个错误是因为你必须重写 UIPopoverController-Class 的一个方法。不幸的是,我不能说你是哪个,因为目前我无法访问代码。【参考方案2】:

你的代码

InfoView *iv = [[InfoView alloc] initWithNibName:@"InfoView" bundle:nil];


UINavigationController *uc = [[UINavigationController alloc] initWithRootViewController:iv];


self.pop = [[UIPopoverController alloc] initWithContentViewController:uc];
[self.pop setDelegate:self];
[self.pop presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:true];

完美的只是隐藏默认导航控制器并在InfoView.xib的XIB中添加一个navigationBar并在那里编写cancelButtonAction来执行视图的关闭或tableview选择的详细信息。它工作正常,请检查我以相同方式完成的图像,相信我它工作正常。

【讨论】:

谢谢。现在我看到一个导航栏。但它有标准的蓝色背景。我想在弹出框边框的渐变中“集成”导航。 你可以改变你想要的字体的渐变。选择您的导航栏样式为 UIBarStyleDefault、UIBarStyleBlack、UIBarStyleBlackOpaque。您也可以更改条形图的颜色。【参考方案3】:

将此添加到您的代码中 [self.pop presentPopoverFromBarButtonItem:se.. 行之前:

uc.modalPresentationStyle = UIModalPresentationCurrentContext;

请参阅modalPresentationStyle property 的文档。

【讨论】:

感谢您的回答。但不幸的是,背景仍然是不可见的。【参考方案4】:

我认为您需要为 InfoView 控制器粘贴更多代码,因为我怀疑这就是问题所在。

【讨论】:

那么这就是问题所在;)【参考方案5】:

您是否尝试过将背景视图设置为班级?

    [pop setPopoverBackgroundViewClass:bgView];

【讨论】:

以上是关于如何在 iPhone 上的 UIPopoverController 中显示 NavigationController-background的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 上的 UIPopoverController 中显示 NavigationController-background

在 iPhone 上处理时如何使 iPad 上的 iOS 推送通知无效?

如何提高 iPhone 上的核心数据获取性能?

如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法

如何隐藏 iPhone 上的 CSS,而不是其他浏览器?

如何检测 iPhone 上的内存泄漏?