得到的初始contenSize是个估算值,不然没有适配在

卡通的操作是观看tableView的contentOffset变化后实行的,万分动画发生在tableView reloadData之后,也便是说tableView reloadData之后,tableView的contentOffset发生了一遍生成。查了下资料开采原因是iOS11中暗许开启了Self-Sizing,在WWDC 2017 session204 Updating Your App for iOS 11中有介绍,由此钻探了下这些session,本文作为三个计算,下文的第三部分会有对上述的动画极度的由来分析及消除措施。

Table Views :在iOS 1第11中学暗中认可启用Self-Sizing这么些应该是UITableView最大的变动。大家驾驭在iOS8引进Self-Sizing 之后,大家能够通过落到实处estimatedRowHeight相关的性质来体现动态的内容,完成了estimatedRowHeight属性后,得到的最早contenSize是个估计值,是透过estimatedRowHeight x cell的个数获得的,并不是终极的contenSize,tableView不会贰遍性总结有所的cell的中度了,只会总计当前荧屏能够显得的cell个数再加上多少个,滑动时,tableView不停地得到新的cell,更新本人的contenSize,在滑到最终的时候,会博得精确的contenSize.Self-Sizing在iOS11下是暗中同意开启的,Headers, footers, and cells都暗中同意开启Self-Sizing,全体estimated 中度暗中同意值从iOS11事先的 0 更改为UITableViewAutomaticDimension:

4.要及时跟新第三方SDK哦,感觉对方也会跟新适应iOS11.

            [tableView reloadData]视图会有极其滑动原因消除

Table Views :在iOS 1第11中学暗中认可启用Self-Sizing

其一相应是UITableView最大的改观。咱们掌握在iOS8引进Self-Sizing 之后,大家得以因此兑现estimatedRowHeight相关的性质来展现动态的从头到尾的经过,完成了estimatedRowHeight属性后,得到的开首contenSize是个测度值,是经过estimatedRowHeightxcell的个数获得的,并非最后的contenSize,tableView不会贰次性总结有所的cell的万丈了,只会一个钱打二十七个结当前荧屏能够呈现的cell个数再拉长多少个,滑动时,tableView不停地获得新的cell,更新自个儿的contenSize,在滑到最后的时候,会收获不错的contenSize。创设tableView到展现出来的长河中,contentSize的总括进度如下图:

图片 1

image.png

Self-Sizing在iOS11下是暗中同意开启的,Headers, footers, and cells都暗中同意开启Self-Sizing,全部estimated 中度默许值从iOS11从前的 0 改造为UITableViewAutomaticDimension:

@property(nonatomic)CGFloatestimatedRowHeightNS_AVAILABLE_IOS(7_0);// default is UITableViewAutomaticDimension, set to 0 to disable

假定近来项目中一贯不选用estimateRowHeight属性,在iOS11的条件下将在潜心了,因为张开Self-Sizing之后,tableView是使用estimateRowHeight属性的,那样就能招致contentSize和contentOffset值的变化,即使是有动画是观测那八个属性的转换实行的,就可以形成动画的要命,因为在打量行高机制下,contentSize的值是一丝丝地生成更新的,全数cell突显完后才是最终的contentSize值。因为不会缓存准确的行高,tableView reloadData的时候,会再一次总括contentSize,就有希望会挑起contentOffset的改变。iOS11下不想利用Self-Sizing的话,能够经过以下措施关闭:

self.tableView.estimatedRowHeight =0;self.tableView.estimatedSectionHeaderHeight =0;self.tableView.estimatedSectionFooterHeight =0;

iOS11下,若无设置estimateRowHeight的值,也未尝设置rowHeight的值,那contentSize计算伊始值是 44 * cell的个数,如下图:

图片 2

5 UIScrollView底部向下活动了

图片 3

那是也是因为automaticallyAdjustsScrollViewInsets失效,扩充了contentInsetAdjustmentBehavior的缘故,跟上边同样。
化解办法,是接纳runtime,将UIScrollView的contentInsetAdjustmentBehavior属性私下认可置为never,代码如下:

@implementation UIScrollView (contentInset)
+ (void)load {
    [super load];
    //因为是为了适配iOS11 所以只有在系统是iOS11的时候用过运行时修改这个值
    if (@available(iOS 11.0, *)) {
        Method originalM = class_getInstanceMethod([self class], @selector(initWithFrame:));
        Method exchangeM = class_getInstanceMethod([self class], @selector(cl_initWithFrame:));
        method_exchangeImplementations(originalM, exchangeM);
    }
}
- (instancetype)cl_initWithFrame:(CGRect)frame {

    if (@available(iOS 11.0, *)) {
        self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
        // Fallback on earlier versions
    }
    return [self cl_initWithFrame:frame];
}
@end

(1)UIScrollView的适配难点

对于UIScrollView的iOS11适配难点,无非就是指向safe area所开展的适配。
首先自个儿先来讲一下怎么样动静下要求适配当tableView的frame超出安全区域限按期,系统会自动调治内容的职分,SafeAreaInsets值会不为0,于是影响tableView的adjustContentInset值,于是影响tableView的内容展示,导致tableView的content下移了SafeAreaInsets的离开。SafeAreaInsets值为0时,是常常的气象。

亟需领悟种种页面包车型地铁构造,看tableView是或不是被系统的statusbar或navigationbar覆盖,如果被覆盖的话,则会生出下移。也得以因而tableview.safeAreaInsets的值来认可是因为安全区域的难题导致的从头到尾的经过下移。

一般来讲代码片段,可以看来系统对tableView向下调度了20pt的离开,因为tableView赶过了辽阳区域范围,被statusbar覆盖。
那么大家就来看一下,怎么样消除那一个标题:

  • 新增contentInsetAdjustmentBehavior属性
    iOS11 甩掉了事先UIViewController的automaticallyAdjustsScrollViewInsets,使用contentInsetAdjustmentBehavior属性举办了代表,功效与原先的周边,根据某些情状自行调节scrollview的contentInset(实际退换的是adjustedContentInset属性,contentInset属性不会变)
    adjustContentInset表示contentView.frame.origin偏移了scrollview.frame.origin多少;是系统总括得来的,总计方法由contentInsetAdjustmentBehavior决定。有以下三种总括方法,即contentInsetAdjustmentBehavior的三个枚举类型:
  1. UIScrollViewContentInsetAdjustmentAutomatic:如若scrollview在一个automaticallyAdjustsScrollViewContentInset = YES的controller上,并且这一个Controller包蕴在二个navigation controller中,这种情景下会设置在top & bottom上 adjustedContentInset = safeAreaInset + contentInset不管是还是不是滚动。其余意况下与UIScrollViewContentInsetAdjustmentScrollableAxes一样
  2. UIScrollViewContentInsetAdjustmentScrollableAxes: 在可滚动方向上adjustedContentInset = safeAreaInset + contentInset,在不足滚动方向上adjustedContentInset =

    contentInset;依赖于scrollEnabled和alwaysBounceHorizontal / vertical

    YES,scrollEnabled默感觉yes,所以超越59%状态下,总结方法或许adjustedContentInset = safeAreaInset + contentInset;
  3. UIScrollViewContentInsetAdjustmentNever: adjustedContentInset = contentInset
  4. UIScrollViewContentInsetAdjustmentAlways: adjustedContentInset = safeAreaInset + contentInset

当contentInsetAdjustmentBehavior设置为UIScrollViewContentInsetAdjustmentNever的时候,adjustContentInset值不受SafeAreaInset值的震慑。

_titleView.intrinsicContentSize = CGSizeMake;

在本子更新中,蒙受的iOS11适配难点:

适配iOS 11

4、applicationDidEnterBackground 不执行

APP 步入后台后,applicationDidEnterBackground: 这些艺术将延期大致 1000纳秒实施, 那么只要在步入后台时做一些任务,恐怕会达不到预期的作用。假诺APP 刚走入应用马上运营,applicationDidEnterBackground: 和 applicationWillEnterForeground: 那三个主意都不会调用。如若有诸如此比贰个光景,步向后台后给使用设置手势密码,当 应用软件 刚进来后就当下运维,那么 applicationDidEnterBackground:这么些艺术不会应声实践,进而手势密码也就不会设置。

翻看原作

3.tableview的cell到上下圆角,cell长度被切了一块

原代码:

UIBezierPath *maskPath = [UIBezierPath
                                      bezierPathWithRoundedRect:cell.bounds
                                      byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                      cornerRadii:CGSizeMake(3, 3)
                                      ];

            CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];

            maskLayer.frame = cell.bounds
            maskLayer.path = maskPath.CGPath;
            cell.layer.mask = maskLayer;

现直接写死cell的bounds:

UIBezierPath *maskPath = [UIBezierPath
                                      bezierPathWithRoundedRect:CGRectMake(0, 0, SCREEN_WIDTH - 10, 44)
                                      byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                      cornerRadii:CGSizeMake(3, 3)
                                      ];

            CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];

            maskLayer.frame = CGRectMake(0, 0, SCREEN_WIDTH - 10, 44);
            maskLayer.path = maskPath.CGPath;

            cell.layer.mask = maskLayer;

适配iPhone X

实际上很简短,正是就是境况栏由20改为了44,底部的tab中度由49改为了82,给你几个宏就行。
判定是还是不是为BlackBerry X方法

+ (BOOL)isiPhoneX
{
    UIApplication *app = [UIApplication sharedApplication];
    UIView *statusBar = [app valueForKey:@"statusBar"];
    if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
        return YES;
    } else {
        return NO;
    }
}

而后就毫无将高度写死了,用上边那几个就好了。

#define kNavBarHeight 44.0
#define kStatusBarHeight ([UIDevice isiPhoneX] ? 44.0:20.0)
#define kStatueAddHeight (kStatusBarHeight - 20.0)
#define kTopHeight (kStatusBarHeight + kNavBarHeight)
#define kTabBarHeight ([UIDevice isiPhoneX] ? 83.0:49.0)
#define kTabBarAddHeight (kTabBarHeight - 49.0)

显示屏下方那些home提醒器能够遮蔽掉的,方法如下:

 if (@available(iOS 11.0, *)) {
       [self setNeedsUpdateOfHomeIndicatorAutoHidden];
 }

- (BOOL)prefersHomeIndicatorAutoHidden
{
    return YES;
}

(2)Launch Screen Storyboard

假诺你采用的是Launch Screen Storyboard 格局来增加的起步页,当然对于非iphoneX的牢笼你无需思考,但是OPPO X 的状态栏由原来的 20 变为了 44。这个只要在导航的职位设置自定义的 View,在 金立 X 上出题目。会遮蔽 View 的显得。
进而您在自定义运维页的时候供给专门针对iphonX做相应的布局,需求调节下 Top 的束缚,在此从前为 -20 ,改为 -44 ;
<font color='red'>所以作者更建议大家利用LauchImage加载的运转页,那样相比较方便快速,可以平昔指向iphoneX设置相应的启航页,当然如若你要求自定义运转页的动画片效果怎样的,依然相比吻合采用Launch Screen Storyboard。</font>

查看原来的小说

9.

1 有个别页面UITableView突显不全

图片 4

缘由:在这一个页面小编都利用到了UITableView的contentSize,比方上面那一个

- (void)reloadScrollView
{
    CGFloat top = 0;
    [self.pictureView setZy_Top:top];
    top = top + self.pictureView.zy_height;
    [self.viewChange setZy_Top:top];
    top = top + self.viewChange.zy_height;
    [self.tableViewFitment setZy_Top:top];
    [self.tableViewFitment setZy_Height:self.tableViewFitment.contentSize.height];
    top = top + self.tableViewFitment.contentSize.height + 20;
    [self.viewBottom setZy_Top:top];
    top = top + self.viewBottom.zy_height;
    self.mainScrollView.contentSize = CGSizeMake(kWidthScreen, top);
}

参照作品你大概需求为您的 应用程式 适配 iOS 11
在iOS1第11中学暗许开启了Self-Sizing,这么些相应是UITableView最大的退换。在iOS8引进Self-Sizing之后,大家能够通过兑现estimatedRowHeight相关的性质来展现动态的从头到尾的经过,完毕了estimatedRowHeight属性后,获得的初叶contentSize是个推断值,是透过estimatedRowHeight 乘以 cell的个数得到的,并非最后的contentSize,tableView就不会二遍性总括有所的cell的惊人了,只会总结当前荧屏能够展现的cell个数再增进多少个,滑动的时候tableView不停地获取新的cell,更新本人的contentSize,在滑到最终的时候,会拿走准确的contentSize。

Self-Sizing在iOS11下是私下认可开启的,Header,footers,and Cells都暗中同意开启Self-Sizing,全体estimated中度暗许值从iOS11事先的0变为UITableViewAutomaticDimension。假设项目中绝非洲开发银行使estimatedRowHeight属性,在iOS11的意况下就要小心了,因为展开Self-Sizing之后,tableView是应用estimatedRowHeight属性的,那样就能够导致contentSize和contentOffset值的生成,倘若是有动画观看那七个属性的变型进行的,就能促成动画的卓越,因为在打量行高机制下,contentSize的值是一小点地扭转更新的,全体cell显示完后才是终极的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会重复计算contentSize,就有非常的大可能率引起contentOffset的更改。
iOS11下不想利用Self-Sizing的话,能够经过以下措施关闭:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

(1)使用LaunchImage

若是您利用的是LauchImage加载的运转页,那么对于他的适配就比较轻巧了,直接在LauchImage中增添二个1125 * 2436的运转图片运维页面即可。
我们可以友善增添图片或许筹划一张尺寸:1125 * 2436的运行图片, 移动到LaunchImage的Finder目录中, 并在LaunchImage中的Contents.json文件中扩张(注意Json格式应该无需手动增加,默许应该会活动抬高的,未尝试):

{
    "extent" : "full-screen",
    "idiom" : "iphone",
    "subtype" : "2436h",
    "filename" : "图片名字.png",
    "minimum-system-version" : "11.0",
    "orientation" : "portrait",
    "scale" : "3x"
}

在测量检验知行办公中就像于微信交际圈的天地效用时,开掘iOS10中被导航栏掩饰的下拉刷新在IOS1第11中学冒出在导航栏下边,那样下拉刷新向来留存,并不是潜伏起来。从前的代码是如此写的:

1.Tableview的section之间离开加大

本来是只写了:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {

    return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {

    return 1;
}

于今内需扩张:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return nil;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return nil;
}

tableview的section之间相距就恢复生机符合规律了

4 UINavigationBar展现出标题

图片 5

参照文章
相较于iOS11事先的本子,UINavigationBar结构上也与事先分裂,如下图所示

图片 6

iOS11

图片 7

iOS11之前

能够观看,原本的UINavigationItemView 被轮换为 UINavigationBarContentView了。一般的法子是写个子类承袭UINavigationBar,然后遍历UINavigationBar的子控件并修改frame。参考小说中有说,可是自个儿试了下,开采照旧不符合规律,别的界面或然会面前蒙受震慑。所以本身的秘籍是一贯改变背景为海洋蓝,然后将上面这根线给删掉,本身加二个线。
参照代码如下:

    fileprivate lazy var navBar: UINavigationBar = {
        let navBar = UINavigationBar()
        navBar.setBackgroundImage(UIImage(), for: .default)
        navBar.shadowImage = UIImage()
        navBar.backgroundColor = UIColor.white
        return navBar
    }()

2、UITabelView、UIScrollView的适配难点

自己看了多篇小说,对UITabelView、UIScrollView的适配情势,不尽同样,但在对UITabelView、UIScrollView适配在此以前,大家第一要打听一下iOS11引进的四个新的概念:Safe Area;
那么哪些是Safe Area,小编的知道就因iphoneX的曲屏导致了好几区域不可能用于实践顾客的相互,那么开采者就不得不将客商的相互事件及页面突显于那多个除了圆角区域的可交互区域限定内,那样就会确定保障开荒者设计的app能够健康的施用与相互,但只要客户使用了系统的navigationbar以及系统的uitabbar,那么系统就能私下认可把安全区域缩减为去掉navigationbar以及uitabbar暗中同意中度的客户可操作区域,这正是小编觉着的安全区域。具体的领会本身建议查看这两篇小说:八分钟弄懂索尼爱立信X 设计尺寸和适配以及iOS 11 安全区域适配总括。

能够透过机型判定,再本身写偏移配置

6. WebView的contentInset不起功能了

原代码

self.webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0);

以往意识webview的内容完整发展了49
现修改了:

   self.webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 49, 0);
    if (@available(iOS 11.0, *)) {

        self.webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        /*
         typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
         UIScrollViewContentInsetAdjustmentAutomatic, // 和UIScrollViewContentInsetAdjustmentScrollableAxes一样,scrollView会自动计算和适应顶部和底部的内边距并且在scrollView 不可滚动时,也会设置内边距.
         UIScrollViewContentInsetAdjustmentScrollableAxes, // 自动计算内边距
         UIScrollViewContentInsetAdjustmentNever, // contentInset 不调整
         UIScrollViewContentInsetAdjustmentAlways, //contentinset总是由滚动视图的safeareainsets调整
         }
         */

    } else {
        // Fallback on earlier versions
    }

标题化解~
案由: 假设有一部分文件位于UI滚动视图的在那之中,并富含在导航调节器中,今后相像navigationContollers会传入七个contentInset给其最顶层的viewController的scrollView,在iOS1第11中学展开了八个极大的变动,不再通过scrollView的contentInset属性了,而是新添了一天性质:adjustedContentInset,下边包车型地铁两张图的对峙统一能够代表adjustContentInset表示的区域。
新扩充的contentInsetAdjustmentBehavior属性用来配置adjustedContentInset的一言一行。(抄与网络)

前几天恰好用Xcode8打包宣布了1.4.0版本,然后马上iOS11就发布了,当时还想着要不要撤回来,不然未有适配在iOS11上岂不是乱了。后来察觉是多虑了,因为是用Xcode8打大巴包,所以不会有一点都不小标题。伴随着iOS11宣布,Xcode9也换代了,用Xcode9打包的话需求适配好,不然真的会乱的。
上面就介绍下适配进度中部分标题和平化解决办法。

5.UIImagePickerController 设置导航背景图

[self.navigationBar setBackgroundImage:[UIImage imageNamed:@"navBg"] forBarMetrics:UIBarMetricsDefault];

如此那般设置开采对 UIImagePickerController 不起成效,要求动用:

self.navigationBar.barTintColor = [UIColor blackColor];
- setContentSize:contentSize{ // 为避免在首次初始化时造成干扰, 只有contentSize不等于时才自动根据size大小调整offset(高度扩大多少, offset就调整多少) if (!CGSizeEqualToSize(self.contentSize, CGSizeZero)) { if (contentSize.height > self.contentSize.height) { CGPoint offset = self.contentOffset; offset.y += (contentSize.height - self.contentSize.height); self.contentOffset = offset; } } [super setContentSize:contentSize];}

2.[tableView reloadData] 发生滚动

以此应该是UITableView最大的改动。大家驾驭在iOS8引进Self-Sizing 之后,大家得以通过落到实处estimatedRowHeight相关的习性来显示动态的内容,完结了estimatedRowHeight属性后,得到的初步contenSize是个估计值,是透过estimatedRowHeight x cell的个数获得的,并不是终极的contenSize,tableView就不会二次性总括有所的cell的中度了,只会总计当前显示屏可以显得的cell个数再加上多少个,滑动时,tableView不停地得到新的cell,更新自身的contenSize,在滑到最终的时候,会博得不错的contenSize。
Self-Sizing在iOS11下是暗许开启的,Headers, footers, and cells都暗许开启Self-Sizing,全部estimated 高度暗许值从iOS11事先的 0 退换为UITableViewAutomaticDimension.
只要近些日子项目中从未运用estimateRowHeight属性,在iOS11的条件下将在细心了,因为展开Self-Sizing之后,tableView是运用estimateRowHeight属性的,那样就能够促成contentSize和contentOffset值的转换,假若是有动画是洞察这两特特性的变动实行的,就能够导致动画的丰硕,因为在审时度势行高机制下,contentSize的值是一小点地转变更新的,所有cell展现完后才是最终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会再也总结contentSize,就有希望会孳生contentOffset的变化.
iOS11下,若无设置estimateRowHeight的值,也未曾安装rowHeight的值,那contentSize计算伊始值是 44 * cell的个数,如下图:rowHeight和estimateRowHeight都以暗中认可值UITableViewAutomaticDimension 而rowNum = 15;则开头contentSize = 44 * 15 = 660;(以上原理是网络抄来的)
消除措施:

        _orderDetailTableView.estimatedRowHeight = 0;
        _orderDetailTableView.estimatedSectionFooterHeight = 0;
        _orderDetailTableView.estimatedSectionHeaderHeight = 0;

3 音讯通告分界面tableView往上移动了,

图片 8

参照小说
iOS1第11中学automaticallyAdjustsScrollViewInsets属性失效了,扩充了contentInsetAdjustmentBehavior属性,automaticallyAdjustsScrollViewInsets是viewController的习性,默感觉true,一般的话要是scrollView直接增加到调节器视图上时,会活动安装scroll的inset属性来空出status bar, search bar, navigationBar, toolBar等的职分来,在普通的支付中为了程序的安静与自由度一般我们是将以此天性设置为false。可是,这么些特性未来失效了,所以会变成地方的主题素材。
化解办法很轻巧,如下

        if #available(iOS 11.0, *) {
            tableView.contentInsetAdjustmentBehavior = .never
            tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0)
            tableView.scrollIndicatorInsets = tableView.contentInset
        }

(2)UITableView

  • 在UITableview中的消除偏移的标题

1.再次安装tableView的contentInset值,来平衡掉SafeAreaInset值,因为内容偏移量 = contentInset + SafeAreaInset
假定在此以前本身设置了contentInset值为(64,0,0,0),现在系统又设置了SafeAreaInsets值为(64,0,0,0),那么tableView内容下移了64pt,这种处境下,能够安装contentInset值为(0,0,0,0),相当于遵循系统的安装了。
2.设置tableView的contentInsetAdjustmentBehavior属性
只要没有须要系统为您设置边缘距离,能够做以下设置:

//如果iOS的系统是11.0,会有这样一个宏定义“#define __IPHONE_11_0  110000”;
如果系统版本低于11.0则没有这个宏定义
#ifdef __IPHONE_11_0   
   if ([tableView respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
   tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
#endif

contentInsetAdjustmentBehavior属性也是用来替代automaticallyAdjustsScrollViewInsets属性的,推荐应用这种措施。
3.透过安装iOS 11增加产量的性质addtionalSafeAreaInset;
iOS 11事先,我们是因此将Controller的automaticallyAdjustsScrollViewInsets属性设置为NO,来禁止系统对tableView调节contentInsets的。固然照旧想从Controller等级化解难题,那么能够经过设置Controller的additionalSafeAreaInsets属性,假诺SafeAreaInset值为(20,0,0,0),那么设置additionalSafeAreaInsets属性值为(-20,0,0,0),则SafeAreaInsets不会对adjustedContentInset值产生影响,tableView内容不会显得至极。这里必要留神的是addtionalSafeAreaInset是Controller的性质,要明了SafeAreaInset的值是由哪些Controller引起的,恐怕是由本人的Controller调解的,恐怕是navigationController调解的。是由哪位Controller调解的,则设置哪些Controller的addtionalSafeAreaInset值来平衡掉SafeAreaInset值。
<font color='red'>关于MJRefresh</font>
而且,由于contentInsetAdjustmentBehavior的产生以及automaticallyAdjustsScrollViewInsets的扬弃,大家平日用的MJRefresh也会发出相应的难点,具体的赶尽杀绝办法,与之同理。

  • iOS 1第11中学UITableview默许启用Self-Sizing

这么些理应是UITableView最大的更动。我们领略在iOS8引进Self-Sizing 之后,大家可以透过完毕estimatedRowHeight相关的属性来展现动态的情节,完毕了estimatedRowHeight属性后,获得的伊始contenSize是个估计值,是通过estimatedRowHeight x cell的个数得到的,并不是最终的contenSize,tableView就不会二遍性总计有所的cell的冲天了,只会猜想当前显示屏能够呈现的cell个数再增多多少个,滑动时,tableView不停地猎取新的cell,更新自个儿的contenSize,在滑到最终的时候,会获得准确的contenSize。在测量试验德姆o中,成立tableView到显示出来的经过中,contentSize的计量进度如下图:

1

Self-Sizing在iOS11下是暗中认可开启的,Headers, footers, and cells都暗中同意开启Self-Sizing,全体estimated 高度私下认可值从iOS11事先的 0 改动为UITableViewAutomaticDimension:

2

倘诺近年来项目中从不动用estimateRowHeight属性,在iOS11的景况下将要小心了,因为打开Self-Sizing之后,tableView是选取estimateRowHeight属性的,那样就能够导致contentSize和contentOffset值的浮动,假使是有动画是重点那四个特性的变通举办的,就能促成动画的不得了,因为在审时度势行高机制下,contentSize的值是一小点地扭转更新的,全数cell展现完后才是终极的contentSize值。因为不会缓存准确的行高,tableView reloadData的时候,会再一次计算contentSize,就有相当大希望会引起contentOffset的生成。iOS11下不想使用Self-Sizing的话,能够经过以下办法关闭:(前言中关系的标题也是透过这种艺术消除的)

3

iOS11下,若无设置estimateRowHeight的值,也尚无安装rowHeight的值,那contentSize总结开始值是 44 * cell的个数,如下图:rowHeight和estimateRowHeight都以私下认可值UITableViewAutomaticDimension 而rowNum = 15;则初阶contentSize = 44 * 15 = 660;

4

  • 新增separatorInsetReference属性

分水线相关的,有2个可选值:

public enum UITableViewSeparatorInsetReference : Int {
  // The value set to the separatorInset property is interpreted as an offset from the edges of the cell.
  case fromCellEdges
  // The value set to the separatorInset property is interpreted as an offset from the automatic separator insets.
  case fromAutomaticInsets
}

举例,TableView的separator私下认可左侧会留15,借使要去掉那么些空子,顶头呈现
iOS 11事先的写法:

table.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
cell.layoutMargins = .zero

iOS 11随后的写法:

table.separatorInsetReference = .fromCellEdges //默认就是fromCellEdges,所以可以不写这行代码
cell.separatorInset = .zero
  • Swipe actions
    在iOS8随后,苹果官方增添了UITableVIew的右滑操作接口,即激增了多个代理方法(tableView: editActionsForRowAtIndexPath:)和三个类(UITableViewRowAction),代理方法再次回到的是二个数组,我们得以在那个代理方法中定义所供给的操作按键(删除、置顶等),这几个开关的类正是UITableViewRowAction。那一个类只好定义开关的展现文字、背景观、和开关事件。而且重回数组的率先个要素在UITableViewCell的最右边展现,最终贰个元素在最左边呈现。从iOS 11方始有了一些改成,首先是能够给那个按键增加图片了,然后是若是完成了以下五个iOS 11激增的代办方法,将会代替(tableView: editActionsForRowAtIndexPath:)代理方法:
// Swipe actions

// These methods supersede -editActionsForRowAtIndexPath: if implemented

- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath

- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath

那五个代理方法再次回到的是UISwipeActionsConfiguration类型的靶子,创造该对象及赋值可看下边包车型客车代码片段:

- ( UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {

    //删除

    UIContextualAction *deleteRowAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"delete" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
        [self.titleArr removeObjectAtIndex:indexPath.row];
        completionHandler (YES);
    }];
    deleteRowAction.image = [UIImage imageNamed:@"icon_del"];
    deleteRowAction.backgroundColor = [UIColor blueColor];
    UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[deleteRowAction]];
    return config;
}

开创UIContextualAction对象时,UIContextualActionStyle有二种档案的次序,假如是置顶、已读等开关就接纳UIContextualActionStyleNormal类型,delete操作按键可选用UIContextualActionStyleDestructive类型,当使用该项目时,若是是右滑操作,一向向右滑动某些cell,会直接实践删除操作,不用再点击删除按键,那也是五个有趣的翻新。
滑动操作这里还大概有一个急需留意的是,当cell高度较时辰,会只展现image,不显得title,当cell高度够大时,会同不时常间出示image和title。笔者写demo测量试验的时候,因为种种cell的莫斯中国科学技术大学学都异常的小,所以只展示image,然后自个儿扩充cell的惊人后,就能够何况呈现image和title了。见下图比较:

action

本文由必威发布于必威-编程,转载请注明出处:得到的初始contenSize是个估算值,不然没有适配在

相关阅读