UINavigationItem提示问题

时间:2014-03-01 14:50:03

标签: ios ios7 prompt uinavigationitem

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

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

prompt

然而,当我弹回主视图控制器时,视图没有调整大小并且窗口显示通过(窗口显示为红色):

window

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

我已尝试了一些操作,例如在viewWillDisappearviewDidDisappear中将提示设置为nil,但似乎没有任何修复方法。

如果我将导航控制器中的导航栏设置为半透明,则可以解决此问题 - 不幸的是,这不是一个选项。

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

提前感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

我能想到的解决方案是继承主服务器的UIView,并实现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 ,在开始进入视图层次结构之前,根据需要设置参数。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

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

enter image description here

答案 3 :(得分:0)

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
        }
    }
}

答案 4 :(得分:0)

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

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