自定义UIToolBar在iPhone X页面底部适配问题

先来看两张在iPhone X上面UIToolBar的截图:

image
image

两张图中底部都是UIToolBar,不同的是第一张是UINavigationController自带的toolBar,
第二张是自定义的toolBar。

第一张图中部分实现代码:

[self.navigationController setToolbarHidden:NO animated:NO];
[self.navigationController.toolbar setBarStyle:UIBarStyleDefault];
self.navigationController.toolbar.translucent = NO;
self.navigationController.toolbar.tintColor = HEXCOLOR(0xFFD2D2D2);
self.navigationController.toolbar.barTintColor = HEXCOLOR(0xFFD2D2D2);
 
UIBarButtonItem *previewButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_previewButton];
UIBarButtonItem *doneButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_doneButton];
UIBarButtonItem *spaceButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
 
[self setToolbarItems:@[previewButtonItem, spaceButtonItem, doneButtonItem]];

第二张图中自定义实现UIToolBar的代码:

    UIToolbar *bottomToolBar = [[UIToolbar alloc] init];
    [self.view addSubview:bottomToolBar];
  
    UIBarButtonItem *leftFixedSpaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                                                                        target:nil action:nil];
    UIBarButtonItem *middleSpaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                                        target:nil action:nil];
    UIBarButtonItem *rightFixedSpaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                                                                     target:nil action:nil];
    leftFixedSpaceItem.width = rightFixedSpaceItem.width = -10;
    UIBarButtonItem *reCaptureButtonItem = [[UIBarButtonItem alloc] initWithCustomView:reAdd];
    UIBarButtonItem *submitButtonItem = [[UIBarButtonItem alloc] initWithCustomView:submit];
    [bottomToolBar setItems:@[leftFixedSpaceItem,reCaptureButtonItem,middleSpaceItem,submitButtonItem,rightFixedSpaceItem]];
 
    [bottomToolBar mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.trailing.bottom.equalTo(self.view);
    }];

为什么自定义toolBar确不能在iPhone X上自动对safeArea适配呢?
后来发现UIToolBar里面有一些私有subview的高度并不是和toolBar本身一样,toolBar高度是49,_UIBarBackground的高度却是83,

image

image

是不是这个_UIBarBackground的私有subView被当做了toolBar的baselineView了呢,所以决定按这个思路重新对自定义toolBar改一下约束:

[bottomToolBar mas_makeConstraints:^(MASConstraintMaker *make) {
    make.leading.trailing.equalTo(self.view);
}];
//在iOS11上让UIToolBar的lastBaselineAnchor等于view的safeAreaLayoutGuide的bottomAnchor
if (@available(iOS 11.0, *)) {
    [bottomToolBar.lastBaselineAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor].active = YES;
} else {
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:bottomToolBar
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.view
                                                          attribute:NSLayoutAttributeBottom
                                                         multiplier:1
                                                           constant:0]];
}

这样约束果然有用,效果和navigationController自带的toolBar效果一样了:


image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,791评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,251评论 4 61
  • 跟鑫爷在一起也过了不少节日了!他这个人永远只在自己觉得应该花钱的地方毫不吝啬,其他时候都“抠”的要命!其实,女...
    兔子Jamie阅读 1,878评论 0 0
  • 1.你的不以为然,是别人的求之不得 “好羡慕你,到处出去玩”,这是我假期听到最多的开场白了。相比起一些朋友的全世界...
    绿杉小姐阅读 5,826评论 0 1
  • 在这个任性发展的时代,很多事情都被冠以爱之名去完成。不敢打包票说是每一个人,但肯定有不少人“深受其害”。 在我看来...
    哆啦A梦也有梦阅读 2,900评论 0 0