UINavigationBar的与大标题 - 如何找到额外的高度在iOS的11

问题描述 投票:3回答:5

当使用prefersLargeTitles在UINavigationController一个UINavigationBariOS 11,导航栏增加高度。增加是从44到96我已经确认了iPhone手机,但我认为这些数字可以为每个设备改变(或至少我们需要写代码,好像他们可以)。

我想以编程方式寻找“额外”的高度 - 这是传统的UINavigationBar下方添加的显示在大标题时,大标题区域的高度。我可以很容易地找到显示在大标题栏的整个高度,但有一种以编程方式发现独自在酒吧的大标题部分的高度(无任何硬编码)?

我需要这样做的原因是,有,我想以编程方式滚动到一个UITableView的顶部,向下拉动大标题(已在“常规高度”导航栏向上滚动),以便它显示次,内容偏移我需要的是导航栏的额外高度。我可以使用导航栏的总高度,但这会拉的UITableView跌过头。现在做到这一点,我需要如下硬编码:

[self.tableView setContentOffset:CGPointMake(0, -52) animated:NO];
ios uinavigationcontroller uinavigationbar ios11 large-title
5个回答
5
投票

我想你不会找到一个方法来明确解决您的问题。你所要求的是不暴露给用户的导航栏内部的一部分。不过,我想我可以为您提供解决方法。

要理解这一点,让我们在视图中的调试器来看看导航栏(启用大标题)。正如你可以下面的图片上看到有包含特定视图控制器的大标题额外的视图。这种观点是不存在的,当你不支持大标题。

基本上,你想知道什么是视线的高度。

debugger preview of the navigation bar

这是我提出的解决方案/解决方法

extension UINavigationBar
{
    var largeTitleHeight: CGFloat {
        let maxSize = self.subviews
            .filter { $0.frame.origin.y > 0 }
            .max { $0.frame.origin.y < $1.frame.origin.y }
            .map { $0.frame.size }
        return maxSize?.height ?? 0
    }
}

它能做什么

  1. 过滤掉其开始导航栏的顶部子视图。他们是最有可能的背景或导航方面,我们不需要他们。
  2. 查找在最低的子视图导航栏。
  3. 映射导致子视图帧帧大小。
  4. 返回找到子视图或0的高度,如果没有被发现。

这种方法的明显缺点是,它紧密地结合到导航栏,其可以在未来改变的结构。然而,这是不可能的,你会得到的东西比一个或另一个使坏更多。

执行的结果应该如下。

print("Extra height: \(navigationController!.navigationBar.lagreTitleHeight)")
Extra height: 52.0

0
投票

你可以简单地滚动到表视图顶部不知道导航栏的大小。 UITableView带有针对的API。

Option 1

// Get the first index path. You might want to check here whether data source item exists.
NSIndexPath *firstIndexPath = [NSIndexPath indexPathForRow:0
                                                 inSection:0];
// Scroll to it. You can play with scroll position to get what you want
[tableView scrollToRowAtIndexPath:firstIndexPath
                 atScrollPosition:UITableViewScrollPositionTop
                         animated:YES];

Option 2

CGPoint offset = CGPointMake(0.0, -tableView.contentInset.top);
[tableView setContentOffset:offset animated:YES];

0
投票

我刚刚经历了同样的问题。

 -(void)layoutSubviews{
            [super layoutSubviews];
            CGRect rectStatusBar = [[UIApplication sharedApplication] statusBarFrame];
            if (rectStatusBar.size.height==44.f) {
               //statusBar shows
            }else{
                if (@available(iOS 11.0, *)) {
                    for ( UIView*view in self.subviews) {
                        if ([NSStringFromClass(view.classForCoder) isEqualToString:@"_UINavigationBarContentView"]) {
                            view.frame = CGRectMake( 0,20,view.frame.size.width,44);
                        }
                        else if ([NSStringFromClass(view.classForCoder) isEqualToString:@"_UIBarBackground"]) {
                            view.frame = CGRectMake(0,0,view.frame.size.width, 64);
                        }
                    }
                }
            }
        }

0
投票

据我了解,你有导航栏下您的tableView的起源,在UIViewController中的Y = 0。

您的tableView应该有它的顶部约束修复顶端布局引导,或使用新的安全区。这样,你就不必编程计算有什么的导航栏的大小。

如果你从未使用过它,看看自动布局。


-2
投票
if (@available(iOS 11.0, *)) {
    _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
    self.automaticallyAdjustsScrollViewInsets = NO;
}

您可以使用此代码。然后再试一次。这个代码可以从0像素开始您的tableView.frame.y。

© www.soinside.com 2019 - 2024. All rights reserved.