UINavigationItem提示问题

我遇到了一个UINavigationItem的提示问题,我无法解决......

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

提示

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

窗口

这只发生在iOS7上,在iOS6上,视图按预期调整大小。

我已经尝试了一些东西,比如在viewWillDisappearviewDidDisappear中将提示设置为零,但没有任何东西可以解决它。

如果我将导航栏中的导航栏设置为半透明,它会修复此问题 - 不幸的是,这不是一个选项。

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

预先感谢任何帮助!


我能想到的一个解决方案是对主设备的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可以避免该错误。 因此,解决方案是检查半透明,然后进行补偿,使导航栏看起来像你想要的。

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

在这里输入图像描述

链接地址: http://www.djcxy.com/p/90337.html

上一篇: UINavigationItem Prompt Issue

下一篇: Vertical UISlider in iOS with autolayout