【问题标题】:iOS11 customize navigation bar heightiOS11自定义导航栏高度
【发布时间】:2018-02-02 00:47:05
【问题描述】:

首先,感谢您来到这里帮助解决我的问题。谢谢!!!

在 iOS11 beta6 中,sizeThatFits: 似乎不适用于 UINavigationBar。我注意到 UINavigationBar 的结构已经被 Reveal 我的应用所改变。

我已尽力更改自定义导航栏的高度。但是好像一直是44,在iOS11之前就可以了。

- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width, 64);
    return newSize;
}

奇怪的是,我只是在didMoveToSuperview方法中记录了它的框架,它的高度是64,但我真的看到在Reveal和应用程序中是44。

我对此一无所知...请帮帮我..谢谢。

更新:

我发现关于我的自定义导航栏 LayoutConstraints 登录控制台是这样的:

"<NSAutoresizingMaskLayoutConstraint:0x604000495ae0 FDCustomNavigationBar:0x7fe2f01399d0.(null) == 42>",
"<NSAutoresizingMaskLayoutConstraint:0x604000495b30 FDCustomNavigationBar:0x7fe2f01399d0.height == 44>"`

错误我什至没有在我的导航栏中使用自动布局。它有什么问题?

8/28 更新:

我已将自定义导航栏的子视图框架设置为导航栏的- layoutSubviewsmethod。

- (void)layoutSubviews {
    [super layoutSubviews];

    self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), 64);

    for (UIView *view in self.subviews) {

        if([NSStringFromClass([view class]) containsString:@"Background"]) {
            view.frame = self.bounds;
        } else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
            CGRect frame = view.frame;
            frame.origin.y = 20;
            frame.size.height = self.bounds.size.height - frame.origin.y;
            view.frame = frame;
        }
    }
}

但导航栏会覆盖视图控制器的视图。我该如何解决?

【问题讨论】:

标签: ios objective-c uinavigationbar ios11


【解决方案1】:

由于 iOS 11 UINavigationBar 完全支持自动布局(这就是您看到其约束的原因)。我已经向 Apple 打开了雷达,因为我认为为 titleView 设置高度约束会相应地调整导航栏的高度。然而,这是 Apple 的回复:

完全支持自动布局并不意味着您的视图可以影响导航栏布局的其他方面——特别是导航栏强制执行其自身的高度并且不允许标题视图或其他自定义视图超出导航栏的高度。我们正在继续解决此问题,并将再次与您联系。

截至今天,雷达仍处于打开状态。

【讨论】:

  • 可以分享一下苹果的链接吗?
  • @MuhammadAhsanMaqsoodAwan 不幸的是,Apple 的雷达无法公开访问。
  • @emix 解决这个问题的任何解决方法,如何动态导航栏的高度不与 self.view 重叠?
  • @SureshDurishetti 实际上不是。当我需要一个更高的导航栏时,我总是从导航控制器中隐藏默认导航栏并编写自己的自定义视图。
  • @SureshDurishetti 是的。我主要将它用于表格/集合视图,并相应地调整内容插图。
【解决方案2】:

您好,我刚刚遇到了同样的问题。

现在顶部布局指南在 iOS 11 上已弃用。您必须在约束中引用 safeAreaLayoutGuide。

这里是 swift 中的一个例子

    if #available(iOS 11, *) {
        let guide = self.view.safeAreaLayoutGuide.topAnchor
        let height = (self.navigationController?.navigationBar.frame.height)! - CGFloat(12)
        NSLayoutConstraint.activate([
        self.yourTableView.topAnchor.constraint(equalTo: guide, constant: height)
        ])
    }

如您所见,视图的顶部锚点应与 safeAreaLayoutGuide 顶部锚点匹配。在此示例中,我使用变量高度来创建新约束。变量 height 包含导航栏高度减去一个常数。

您应该尝试更改高度值。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 2023-04-07
    • 2013-11-19
    • 1970-01-01
    • 2022-07-18
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多