UINavigationItem提示问题

我对UINavigationItem的提示有问题,我无法解决…

我有一个主视图和一个详细视图控制器。 当我从主服务器推送到详细信息时,详细视图控制器上会显示一个提示:

提示

但是,当我弹回主视图控制器时,视图不会resize并且窗口显示(窗口显示为红色):

窗口

这只发生在iOS7上,在iOS6上,视图按预期resize。

我尝试了一些事情,比如在viewWillDisappearviewDidDisappear中将提示设置为nil,但似乎没有任何东西可以修复它。

如果我将导航控制器中的导航栏设置为半透明,它确实解决了这个问题 – 不幸的是,这不是一个选项。

我在这里创建了一个非常小的示例项目,它演示了这个问题: https : //github.com/InsertWittyName/NavigationItemPrompt

在此先感谢您的帮助!

我能想到的解决方案是viewDidMoveToSuperview master的UIView ,并实现viewDidMoveToSuperview ,将视图的框架设置为从导航栏的高度到viewDidMoveToSuperview的结尾。 由于导航栏不是半透明的,因此您的工作更容易,因为您不必考虑布局指南和内容插入。

有几点需要注意。 当推动和弹出时,系统将视图控制器的视图移动到动画的另一个超视图中,然后将其返回到导航控制器的私有视图层次结构。 此外,当视图超出视图层次结构时,超级视图变为nil

这是一个示例实现:

 @interface LNView : UIView @end @implementation LNView - (void)viewDidMoveToSuperview { [super viewDidMoveToSuperview]; if(self.superview != nil) { CGRect rect = self.superview.bounds; rect.origin.y += 44; rect.size.height -= 44; [self setFrame:rect]; } } @end 

这不是一个完美的实现,因为它使用硬编码值导航栏的高度,没有考虑可能的工具栏等。但是所有这些你可以作为属性添加到此视图和viewDidLoad ,在它开始进入查看层次结构,根据您的需要设置参数。

您可以在用户点按后退按钮时删除提示,如下所示

 override func willMove(toParentViewController parent: UIViewController?) { super.willMove(toParentViewController: parent) if parent == nil { navigationItem.prompt = nil } } 

你自己给出了答案 – 非常出色。 这是一个错误,但检查Translucent可以避免这个错误。 因此,解决方案是检查半透明然后进行补偿,以便导航栏看起来像您想要的那样。

为此,请创建一个小的黑色矩形图像并将其包含在项目中。 将导航栏的背景图像设置为此图像。 检查半透明。 问题解决了! 导航栏现在外观呈黑色不透明,但不再显示错误。

在此处输入图像描述

Swift版本:

 class PromptViewSideEffect: UIView { override func didMoveToSuperview() { super.didMoveToSuperview() if let superview: UIView = self.superview { let rect: CGRect = superview.bounds rect.origin.y += 44 rect.size.height -= 44 self.frame = rect } } } 

无论您的导航栏是不透明还是半透明,都存在问题。 很糟糕的是,苹果已经让这个令人发指的臭虫困扰我们三年多了。

所有这些解决方案都是黑客攻击。 我的解决方案是A)永远不要使用提示,或者B)在每个视图中使用它们,即使你必须将它们设置为“”。