美文网首页iOS开发实用技术技术OC Swift适配iOS 的东西
iOS11 适配之导航栏、tableView、searchBar

iOS11 适配之导航栏、tableView、searchBar

作者: Tomous | 来源:发表于2017-09-28 18:08 被阅读2907次

最近刚接手了个项目,在iOS11之前都没有问题,但是在iOS11上却出现了个别屏幕适配问题,其中包括:1、push进入下一个VC之后,导航栏在会往上移部分距离,大概20像素;2、VC中的tableView向下移动部分距离,以及cell直接的间隔会无故拉大;3、加载webView的时候会向下移动部分距离;4、放在导航栏上面的searchBar消失不见。虽然网上很多文章介绍解决的方法,但是我还是查阅了大部分简书,博客,也花费了差不多两天时间才把这个bug解决完。下面是出现bug界面的图片,希望对你们能有所帮助。


1

2

3

其实解决这些bug很简单,只不过不同的人遇到的问题不同罢了,至于为什么会出现这些bug,你们可以去官方或者大神的简书去看看iOS界面布局的一些改变。现在就针对我们项目当中出现的问题,我一一给出答案,有不懂的,可以私信我。
1、导航栏向上跑了部分距离:宏定义一个高度

#define NAVIGATION_HEIGHT (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) + CGRectGetHeight(self.navigationController.navigationBar.frame))
在你设置的self.navigationBar.frame = CGRectMake(0, 0,ScreenWidth, NAVIGATION_HEIGHT);下面添加
#ifdef __IPHONE_11_0
if (@available(iOS 11.0, *)) {
self.navigationBar.frame = CGRectMake(0, STATUSBAR_HEIGHT,ScreenWidth, NAVIGATION_HEIGHT);
}
#endif

2、VC中的tableView向下移动部分距离,以及cell直接的间隔会无故拉大:

//在你的tableView下面添加这句话
if (@available(iOS 11.0, *)) {
UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
// Fallback on earlier versions
}
//如果你的cell 之间的间距拉大,就在self.xf_tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);这个约束后面添加下面三个约束
self.xf_tableView.estimatedRowHeight = 0;
self.xf_tableView.estimatedSectionHeaderHeight = 0;
self.xf_tableView.estimatedSectionFooterHeight = 0;

3、加载webView的时候会向下移动部分距离:给你的web添加下面约束

if (@available(iOS 11.0, *)) {
webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
// Fallback on earlier versions
}

4、放在导航栏上面的searchBar消失不见:
之前我的代码是这样写的:

// 创建搜索框
UIView *titleView = [[UIView alloc] init];
titleView.py_x = PYSEARCH_MARGIN * 0.5;
titleView.py_y = 7;
titleView.py_width = self.view.py_width - 64 - titleView.py_x * 2;
titleView.py_height = 30;
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:titleView.bounds];
[titleView addSubview:searchBar];
self.navigationItem.titleView = titleView;

这样你会发现搜索框不显示,更改后的代码是将titleView的UIView重写为TUIView
新建一个TUIView类,在该类的.m里面实现以下方法:

#import "TUIView.h"
@implementation TUIView
-(CGSize)intrinsicContentSize
{
return UILayoutFittingExpandedSize;
}
@end
// 创建搜索框
UIView *titleView = [[TUIView alloc] init];
titleView.py_x = PYSEARCH_MARGIN * 0.5;
titleView.py_y = 7;
titleView.py_width = self.view.py_width - 64 - titleView.py_x * 2;
titleView.py_height = 30;
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:titleView.bounds];
[titleView addSubview:searchBar];
self.navigationItem.titleView = titleView;

这样搜索框就显示出来了。
这几个bug着实让我浪费了好多时间,希望我写下这片文章对你们有多帮助

相关文章

网友评论

  • 人比黄瓜黑:受用了:blush:
  • 遇见猫的大鱼:�1、导航栏向上跑了部分距离:宏定义一个高度

    这个貌似没有解决诶,把导航栏下移20 ?这样状态栏岂不是。。
    遇见猫的大鱼:已经解决了,之前没表述清楚,实际上 BarBackground确实要可以修改frame增加20,但是我是把UINavigationBarContentView下移了20才解决问题的
    Tomous:@遇见猫的大鱼 你把导航栏的高度写死试试,先搞清楚导航栏在11以后得高度,变成了88,不是64了
  • Gizone_iac:我在Present 之后在进行Push , NavigationBar 上的Item什么都没有了。 就算我用XIB 拖一个navigationBar 到视图内 并设置他的Item Run 之后还是啥都没有 崩溃
    Tomous:@夜幕下的超人 嗯,解决了,基本上我遇到的就是这几个问题,iOS 11之后,导航栏上面变成了88,不是64了,你可以尝试一下写死他们的高度比较一下。
    一叶知秋的码拉松:我最近接手别人的项目,也遇到和你一样的问题,请问你有没有解决呢,可以分享一下解决方案吗?
    Tomous:@Gizone_iac 我咋没遇到这个问题呀。?我接手的是别人的项目,iOS 11适配出现了上面的几个问题,你说的这个没遇到过:joy:

本文标题:iOS11 适配之导航栏、tableView、searchBar

本文链接:https://www.haomeiwen.com/subject/ijsvextx.html