iOS开发过程中经常会遇到需要隐藏导航栏的分割线的需求,分享一个终极方法。
仔细研究后发现,iOS10只是把_UINavigationBarBackground(UIImageView的子类)改为了_UIBarBackground(UIView的子类)。
这两个对象虽然不同,但是作用是一样的,他的Y值为-20,猜测作用应该是为了将NavigationBar延伸到状态栏下面。
通过打印出来的顺序可以看到不管是_UINavigationBarBackground还是_UIBarBackground,他们都是在UINavigationBar的最底层,也就是最先被addSuview到父View上的。
然后他们的唯一一个子View就是UIImageView类型的对象,并且该对象的高度就是0.5,可以确定就是分割线。
所以经过精简后,去掉导航栏分割线的代码就变成了下面这个样子:
if (@available(iOS 14.0, *)) {
UIView *backgroundView = [self.navigationController.navigationBar subviews].firstObject;
_navBottomLine = backgroundView.subviews.lastObject;
_navBottomLine.hidden = YES;
} else {
UIView *backgroundView = [self.navigationController.navigationBar subviews].firstObject;
_navBottomLine = backgroundView.subviews.firstObject;
_navBottomLine.hidden = YES;
}