TableView的新特性,11中TableViews下拉刷新上移问题

作者:新闻中心

全盘化解。

下图清晰的显示了那二种参照值的区分:

三、Table Views

  1. 咱俩掌握在iOS 8引进Self-Sizing 之后,能够通过兑现estimatedRowHeight 相关的品质来突显动态的开始和结果,当贯彻了estimatedRowHeight 属性后,tableview 会得到的开首 contenSize ,那是一个推测值,是由此estimatedRowHeight * cell的个数获得的,并非终极的 contenSize。

因为有审时度势的 contentSize 值,所以tableView就不会叁遍性总括有所的cell的可观了,只会总结当前显示屏能够展现的cell个数再增加多少个。

滑动时,tableView 不停地获取新的 cell,更新自个儿的 contenSize,在滑到最后的时候,会赢得正确的 contenSize 。在测验德姆o中,创立tableView 到展现出来的长河中,contentSize 的总结进度如下图:

图片 1

  1. Self-Sizing
    在iOS 11中暗中同意启用 Self-Sizing, 也正是说您 cell、header、footer对应的 estimated heights 暗中认可值都从 iOS 11 从前的0 变为UITableViewAutomaticDimension。
    因为私下认可开启了 Self-Sizing,你在结构 cell 时须要保证内部子控件具有完全限制来让 tableview 自动估测计算出其必要的朗朗上口恐怕你在相应的 delegate 方法中回到每叁个 cell 的实在中度值。同理也急需处理相应 header 和 footer 难题。

如果近来项目中一贯不应用estimateRowHeight属性,在iOS11的条件下就要小心了,因为展开Self-Sizing之后,tableView是使用estimateRowHeight属性的,那样就能够形成contentSize和contentOffset值的变型,要是是有动漫是观察这两本性子的变化举办的,就可招致使动画的卓越,因为在打量行高机制下,contentSize的值是一丝丝地转移更新的,全部cell显示完后才是最终的contentSize值。因为不会缓存正确的行高,tableView reloadData的时候,会再度总计contentSize,就有望会唤起contentOffset的变通。

假让你想 link 到 iOS 11 而不想利用这一个暗中同意开启的新性子(Self-Sizing)的话,你可以收回它,代码如下:

override func viewDidLoad() {
//取消 estimated sizes 功能和 tableview 的 Self-Sizing 功能
 tableView.estimatedRowHeight = 0
 tableView.estimatedSectionHeaderHeight = 0
 tableView.estimatedSectionFooterHeight = 0
}

iOS11下,如果未有设置estimateRowHeight的值,也从未设置rowHeight的值,那contentSize总结初阶值是 44 * cell的个数,如下图:rowHeight和estimateRowHeight都以暗中同意值UITableViewAutomaticDimension 而rowNum = 15;则初阶contentSize = 44 * 15 = 660;

图片 2

  1. separatorInset
    tableView 的 readable content guide 概念,它是 View 内的一片段,也是内容构造的引入区域。即使在大显示屏的 华为平板 下,在 readable content guide 内构造的内容都能够拿走精确的客商阅读经历。

图片 3

私下认可景况下 tableview 在 readable content guide 内有多个separatorInset,它能够影响 cell 的暗许分隔线地方 和 在 cell 内 labels 的岗位。

separator.left = 0 separator.left = 30

可见 separatorInset 是对 readable content view 的 inset 处理。

iOS 11 之后,separatorInset 值影响的是,tableview 边框与荧屏的边缘的区间大小,当设置左右为0时,效果如下

图片 4

iPad 横屏下,separatorInset.left = 0 和 separatorInset.right = 0

平常来讲是 separatorInset 值使用对别,此中在 iOS 11后增多可安装参照的属性UITableViewSeparatorInsetReference

typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {  
UITableViewSeparatorInsetFromCellEdges,   //默认值,表示separatorInset是从cell的边缘的偏移量
UITableViewSeparatorInsetFromAutomaticInsets  //表示separatorInset属性值是从一个insets的偏移量
}

比较之下使用如下:

UITableViewSeparatorInsetFromCellEdges UITableViewSeparatorInsetFromAutomaticInsets
  1. tableview 与 Safe Area 交互作用供给留意几点:
  • separatorInset 被电动地提到到 safe area insets,因而,暗中同意意况下,tabelview的全套内容区域防止了ViewController安全区域的插入。
  • UITableviewCell 和 UITableViewHeaderFooterView的 content view 在平安区域内;由此你应有一味在 content view 中选取add-subviews操作
  • 您应该采纳含有 content view 的 UITableViewHeaderFooterView类实例作为table headers 和 footers、section headers 和 footers。
  1. Swipe Actions
    1. 新的滚动条:带有 time stamps 时码的滚动条
    2. 实现 full swipe-to-delete 功能
    3. 增多了又滑作用

2、项目中用到了RealReachability来实时检验网络,可是用Xcode9展开后运转直接报错,如图:

tableView.rowHeight = UITableViewAutomaticDimension

1.  typedef NS_ENUM(NSInteger, UITableViewSeparatorInsetReference) {    
2.  UITableViewSeparatorInsetFromCellEdges,   //默认值,表示separatorInset是从cell的边缘的偏移量  
3.  UITableViewSeparatorInsetFromAutomaticInsets  //表示separatorInset属性值是从一个insets的偏移量  
4.  }  

测验默许开启Self-Sizing的 iOS 11标题。

1、进级到Xcode9后新建三个工程,直接报错,如下图:

看图

Table Views:separatorInset 扩展

一、Safe Area

从 iOS 7 伊始,大家就在操作系统里提供这么的半透明的栏,而且鼓劲你把要呈现的内容构造延伸过这一个栏,就好像下图中照片 App 中做的那样。(注意最上部和底部都蕴涵 Bar,且故事情节都被 Bar 所覆盖,产生出模糊效果)

图片 5

image.png

据此又这么的机能是接纳了 UIViewController 的性能edgesForExtendedLayout,它能够让作为 Container 的ViewControllers 定义这么些(translucent bars)栏下View 的尺寸

edgesForExtendedLayout控制 View 的大小 让 translucent bars 覆盖其上之后带有模糊效果

私下认可情形下edgesForExtendedLayout 适用于全部的边缘,你能够经过topLayoutGuide 和 bottomLayoutGuide 两本特性来定义悬浮栏的朗朗上口。

图片 6

从 iOS 11上马,系统将打消topLayoutGuide 和 bottomLayoutGuide属性,引进新的布局布局概念,SafeArea。

取消topLayoutGuide 和 bottomLayoutGuide属性 新的布局结构概念,SafeArea。

safeArea是描述您的视图部分不被别的内容遮挡的办法。 它提供三种办法:safeAreaInsets 或 safeAreaLayoutGuide 来提要求你 safeArea 的参照值,那多少个天性定义在 UIView 中,它们各自对应 insets 也许layout guide类型。

比方在您自定义的 ViewController 中增添一些自定义的栏样式 View,那个时候就须要改动 safeAreaInsets 的值。要想扩展或调整和收缩safeAreaInsets的值,你能够通过调用 UIViewController 的新属性 additionalSafeAreaInsets (UIEdgeInsets 类型)在对应之处增添inset 值进而改变safeAreaInsets。当你的viewController退换了它的safeAreaInsets值时,有二种方式获得到回调:

UIView.safeAreaInsetsDidChange()
UIViewController.viewSafeAreaInsetsDidChange()

种种 view 都可以改变 safeAreaInsets 的值,包蕴 UIViewController。

图片 7

image.png

图片 8

意义图如下:

iOS11下不想行使Self-Sizing的话,能够透过以下格局关闭:(前言中提到的难点也是通过这种格局缓和的)

主题材料1:如下代码是运转在 iOS 10下正规,但运行在 iOS 11则在 tabelView 上下有留白难点
//
//  ViewController.m
//  ios10TabelView
//
//  Created by Jacob_Liang on 2017/9/21.
//  Copyright © 2017年 Jacob. All rights reserved.
//

#import "ViewController.h"

static NSString * const CELLID = @"CELLID";

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, weak) UITableView *tableView;

@end

@implementation ViewController


- (void)viewDidLoad {
    [super viewDidLoad];

    [self setUpInit];
    [self setUpNav];
    [self setUpTableView];

}

- (void)setUpInit {

    self.automaticallyAdjustsScrollViewInsets = NO; //iOS 11下被废弃了,写了也没用
    self.view.backgroundColor = [UIColor purpleColor];
}

- (void)setUpNav {
    self.navigationItem.title = @"出席统计";
}

- (void)setUpTableView {

    CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
    CGFloat screenH = [UIScreen mainScreen].bounds.size.height;

    UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, screenW, screenH - 64) style:UITableViewStyleGrouped];
    [self.view addSubview:tableView];
    _tableView = tableView;
    tableView.backgroundColor = [UIColor lightGrayColor];
    tableView.delegate = self;
    tableView.dataSource = self;

    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CELLID];

}

#pragma mark - UITableViewDelegate & UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 15;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELLID forIndexPath:indexPath];
    cell.textLabel.text = [NSString stringWithFormat:@"%@",indexPath];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 0.01;
}

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

@end

上述代码运市场价格况,注意这个时候 tableview 的 Style 为 UITableViewStyleGrouped

在 iOS 10 下 iOS 11下 iOS 11下
self.automaticallyAdjustsScrollViewInsets = NO 有效 self.automaticallyAdjustsScrollViewInsets = NO 无效 self.automaticallyAdjustsScrollViewInsets = NO 无效
没有调用viewForFooterInSection和viewForHeaderInSection运行正常 没有调用viewForFooterInSection和viewForHeaderInSection运行有留白 调用viewForFooterInSection和viewForHeaderInSection运行正常
iOS10NOReturnViewFooterHeader.gif
NOReturnHeaderOrFooterViewQuestion.gif
wihtReturnHeaderOrFooterView.gif

另一宗办法正是,关闭 iOS 11私下认可张开的 Self-Sizing 作用

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

问题1测试 demo

3、MJRefresh上拉刷新,明明已经调用甘休刷新,然而并不曾坚决守住,还在平素加载央浼数据,如下图所示:

有多少个缓慢解决方案:

Table Views :在iOS 11中私下认可启用Self-Sizing

二、Scroll Views

上面例子中的布局是 UIVIewController UIScrollView 包在
UINavigationController 里面。

图片 9

早先只要一个 VIewController 中带有 ScrollView的话, 被
NavigationController 包住的这么些 ViewController 会自动地调动 ScrollView 的 contentInset 值(扩充64)如下

图片 10

iOS 11之后那么些作为已撤废,取而代之的是,使用几个新的性情adjustedContentInset替代。而 contentInset 那些本性代表的概念老妪能解,单单是内容的区域的 inset,不再与外面结构有关。

图片 11

UIScrollView 扶植活动布局,让scrollView能够依照所增加的sub-view的轻重活动管理其可滚动区域的轻重。iOS 11下越来越加多了有的新的属性来增加帮衬开辟中更便捷的构造,此中包含frameLayoutGuide 和 contentLayoutGuide 以至contentInsetAdjustmentBehavior。

  1. frameLayoutGuide 肩负scrollView在显示屏中的大小和职责,也正是你能够约束 scrollView 中的 sub-view 如下图中的 Page 1 labelView。当您滚动时,该 page 1 labelview 是定点不动的。
约束 scrollView 中的 sub-view Page 1 labelView 当内容滚动后,Page 1 位置不变
  1. contentLayoutGuide,你能够约束 sub-view 来调整器 scrollView 中可滚动区域的深浅照旧让内容随着滚动而活动。
指定 contentLayoutGuide 发生滚动时
  1. contentInsetAdjustmentBehavior属性用来计划adjustedContentInset的一举一动,该构造体有以下三种档期的顺序:
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
    UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable
    UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
    UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
    UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));

/* Configure the behavior of adjustedContentInset.
 Default is UIScrollViewContentInsetAdjustmentAutomatic.
 */
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));

/* When contentInsetAdjustmentBehavior allows, UIScrollView may incorporate
 its safeAreaInsets into the adjustedContentInset.
 */
@property(nonatomic, readonly) UIEdgeInsets adjustedContentInset API_AVAILABLE(ios(11.0),tvos(11.0));

当adjustedContentInset 值被转移后回调的代理方法有:

/* Also see -[UIScrollView adjustedContentInsetDidChange]
 */
- (void)scrollViewDidChangeAdjustedContentInset:(UIScrollView *)scrollView API_AVAILABLE(ios(11.0), tvos(11.0));

因为在iOS7中引进的Top Layout Guide和Bottom Layout Guide,这个结构在iOS 11中被弃用,代替他的是Safe Area Layout Guide. 排除办法就是将下图中系统暗许勾选的两项去掉就能够了

tableView.rowHeight = UITableViewAutomaticDimension

tableView.estimatedRowHeight = 200

图片 12

减轻情势:

图片 13

if (@available(iOS 11.0, *)) {
self.estimatedRowHeight = 0;
self.estimatedSectionHeaderHeight = 0;
self.estimatedSectionFooterHeight = 0;
}

图片 14

下一场,开掘了这么的叁个标题,iOS11 此前,使用Self-Sizing的时候,

以此应该是UITableView最大的改换。大家理解在iOS8引进Self-Sizing 之后,我们得以通过落到实处estimatedRowHeight相关的性质来显示动态的内容,完成了estimatedRowHeight属性后,获得的早先contenSize是个揣摸值,是透过estimatedRowHeight x cell的个数取得的,并不是终极的contenSize,tableView就不会三次性计算有所的cell的高度了,只会计算当前显示屏能够显得的cell个数再加上多少个,滑动时,tableView不停地得到新的cell,更新本人的contenSize,在滑到最终的时候,会赢得精确的contenSize。在测验Demo中,创立tableView到展示出来的长河中,contentSize的计算进程如下图:

图片 15

在那有多少个小Tip:

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

self.tableView.estimatedSectionHeaderHeight =0;

先是再官网络下载了Xcode 9 欧霉素 版本,伴随着Mac OS 从10.12.5 晋级到了 10.12.6 (Xcode 9 只帮衬在风行的系统上运维),幸而公司的网速给力,不到俩钟头的年华,各类下载工作总体消除。

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

图片 16

图片 17

  • separatorInset 被机关地关乎到 safe area insets,因而,暗中同意景况下,表视图的方方面面内容幸免了其根视图调控器的安全区域的插入。
  • UITableviewCell 和 UITableViewHeaderFooterView的 content view 在安全区域内;因此你应当一直在 content view 中应用add-subviews操作。
  • 全数的 headers 和 footers 都应有利用UITableViewHeaderFooterView,富含 table headers 和 footers、section headers 和 footers。

解决办法:将相当不足文件.m都在Compile Sources中增加上就足以了

图片 18

图片 19

self.tableView.estimatedRowHeight =0;

图片 20

image

self.tableView.estimatedSectionFooterHeight =0;

接下来,在cell里面使用Autolayout 拉好光景左右的自律, tableView 就能够动态展现内容了,那是因为estimateRowHeight也正是预测度行高的功力。

图片 21

图片 22

转祸为福区域针对于酷派X的尺寸,来讲,效果是卓有功效的, 不过放到8,8plus 上面,就能莫名多一条汾水陵。所以,能够写七个小延展,来分别是哪个机型:

有以下几点供给小心:

勾选Use Safe Area Layout Guides之后,Top Layout Guide 和 Bottom Layout Guide 被轮流掉,变成 Safe Area。

Table Views 和 Safe Area

在这里地提一点,iOS7 引入的 topLayoutGuide 和 bottomLayoutGuide 在iOS 11中被遗弃了,代替他就是安全区域的概念,提供了两种方法safeAreaInsets 和 safeAreaLayoutGuide,即 insets 大概 layout guide。

iOS 7 引进separatorInset属性,用以设置 cell 的分水岭边距,在 iOS 11中对其开展了增加。能够透过新扩展的UITableViewSeparatorInsetReference枚举类型的separatorInsetReference属性来设置separatorInset属性的参照值。

图片 23

1.  self.tableView.estimatedRowHeight = 0;  
2.  self.tableView.estimatedSectionHeaderHeight = 0;  
3.  self.tableView.estimatedSectionFooterHeight = 0;  

如此的措施关闭。

Self-Sizing在iOS11下是暗中认可开启的,Headers, footers, and cells都暗中认可开启Self-Sizing,全数estimated 中度默许值从iOS11从前的 0 改动为UITableViewAutomaticDimension:

那就有一点窘迫了,于是从头定位难题, 那是二个自定义的View组件, 然后,Autolayout做好约束,准则是如此的,八个Button的Icon 都以牢固的尺寸,固定大小, 如图:

若是最近项目中并没有采纳estimateRowHeight属性,在iOS11的景况下将在小心了,因为张开Self-Sizing之后,tableView是行使estimateRowHeight属性的,那样就能够促成contentSize和contentOffset值的变动,假设是有动漫是观望那三个属性的退换进行的,就能够招致动漫的老大,因为在以己度人行高机制下,contentSize的值是一丝丝地转移更新的,全体cell突显完后才是最后的contentSize值。因为不会缓存精确的行高,tableView reloadData的时候,会重新计算contentSize,就有超大可能率会唤起contentOffset的转移。

诚如难题提出以iOS11专门的学业版以至真机的测量检验为主,模拟器也许有坑的呐。后续会跟进持续立异,,,

image

效能如图:

image

然后,项目中,是只写了-tableView: heightForHeaderInSection:和- tableView: heightForFooterInSection:多个艺术,而iOS11 里面 ,倘使不是闲,相应的viewForSection 方法时,后边两个形式是低效的,

下一场发掘并未有拉左右和前后的束缚~ emmmmm,iOS11事情未发生前都以没难题的, 然后,拉好节制,如图:

两者同时现身,清除。

三种是你早就使用了Self-Sizing的话,能够因而:

self.tableView.estimatedRowHeight = 0

self.tableView.estimatedSectionHeaderHeight = 0

self.tableView.estimatedSectionFooterHeight = 0

这一句话,但是iOS11 中丰富,前面有涉及过。消释思路,当然是增进那句话啦。

tableView.estimatedRowHeight = 200

tableView的品质rowHeight是默认为UITableViewAutomaticDimension,所以大家使用的时候,很多会设置:

一种是你在iOS11下不想使用Self-Sizing的话,能够经过:

对此iOS11 的SDK 更新了怎么样内容,这里不做陈述,详细情形请看:

现实参照他事他说加以考查如下:

iOS 11 SDK 介绍,Developer iOS甚至WWDC的录像啦Updating Your App for iOS 11

图片 24

能够观看,行高都改成私下认可的 44了,Autolayout并不曾立见成效,未有自行动态体现内容啊~

图片 25导航栏左侧Item自定义View

原则性原因,这种是因为自身代码写的TableView,然后AddSubView 到自己的Controller里面包车型大巴。重要因为Table Views 在iOS11中暗中认可启用Self-Sizing,咱们在iOS 8其后, 使用

图片 26

tableView.rowHeight = UITableViewAutomaticDimension

tableView.estimatedRowHeight = 200

extension UIDevice {

public func isX() -> Bool {

if UIScreen.main.bounds.height == 812 {

return true

}

return false

}

}

陪伴着iOS11的发布,iOS端App 又是一波适配的办事,emmmmm,

本文由新葡京8455发布,转载请注明来源

关键词: