美文网首页afnetwork 使用
UITableView使用详解

UITableView使用详解

作者: 你duck不必呀 | 来源:发表于2019-06-04 11:09 被阅读0次

    普通属性

    styleUITableViewStyle两种风格,默认是UITableViewStylePlain即使是默认也都可以通过代码修改

     UITableViewStylePlain //如果有多组,每组标题会置顶悬浮
    
     UITableViewStyleGrouped //如果有多组,每组之间会有间隔
    

    rowHeightsectionHeaderHeight,sectionFooterHeight分别是cell的统一的行高,每组的表头高度,每组的表尾高度;不设置就是默认是UITableViewAutomaticDimension,可以通过下面方法单独设置每组/每行的高度

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
    

    estimatedRowHeight,estimatedSectionHeaderHeight,estimatedSectionFooterHeight估算行高度,每组表头的估算高度,每组表尾的估算高度;默认是UITableViewAutomaticDimension,设置为0代表关掉不用这些属性

    默认情况下(这三个属性值不为0),每次刷新系统会在cell显示出屏幕的时候调用:
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
    如果关掉(设置为0),每次刷新有多少cell三个方法就会调用多少次
    

    separatorInset默认cell分割线的内边距

    20190409110046.jpg
    默认左边有间隙,通过设置可以取消间隙
    tableView.separatorInset=UIEdgeInsetsZero;
    或者自定义
    tableView.separatorInset=UIEdgeInsetsMake(0, 0, 0, 0);
    
    20190409110311.jpg
    separatorStyle分割线样式
    
    separatorStyle=UITableViewCellSeparatorStyleNone;可以去掉分割线
    

    separatorColor分割线颜色

    separatorEffect特效,需要自定义

    separatorInsetReference是个枚举值,也是设置cell分割线内边距的

     UITableViewSeparatorInsetFromCellEdges,默认值
     UITableViewSeparatorInsetFromAutomaticInsets有间隙,设置separatorInset无效
    

    backgroundView背景视图UIView类型
    numberOfSections组数,只读属性,只能通过

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
    

    修改。打印一下值

    2019-04-09 13:34:54.469863+0800 tableView[3630:86352] 10
    

    visibleCells,显示在当前屏幕上的所有cell,只读属性

    indexPathsForVisibleRows只读属性,显示在屏幕上的每个cell的位置NSIndexPath类型

     "<NSIndexPath: 0xc87d249eb15ac677> {length = 2, path = 0 - 0}",
     "<NSIndexPath: 0xc87d249eb17ac677> {length = 2, path = 0 - 1}",
    

    hasUncommittedUpdates个人觉得是个占位符,在编辑cell时候的指示。

    editing编辑模式默认是NO。设置YES后,cell会出现insert/delete/reorder控件

    20190409135633.jpg

    allowsSelection默认是YES,设置为NO不响应任何事件(点击没效果)

    allowsSelectionDuringEditing默认NO,编辑模式下不能选中;设置YES后有选中效果。

    allowsMultipleSelection多选,默认NO,设置YES可以选中多个。

    20190409133530.jpg

    allowsMultipleSelectionDuringEditing默认NO,编辑模式下不能选中多个,设置YES可以选中多个;

    indexPathForSelectedRow选中的行号

    <NSIndexPath: 0xdd209fb893cd93b5> {length = 2, path = 1 - 1}
    

    indexPathsForSelectedRows选中多行的行号,前提是开启allowsMultipleSelection否则和indexPathForSelectedRow效果一样

     "<NSIndexPath: 0xc0cdbcda00f2cef4> {length = 2, path = 1 - 0}",
     "<NSIndexPath: 0xc0cdbcda00d2cef4> {length = 2, path = 1 - 1}",
     "<NSIndexPath: 0xc0cdbcda00b2cef4> {length = 2, path = 1 - 2}"
    

    sectionIndexMinimumDisplayRowCount当行数达到此值时,在右侧显示特殊节索引列表。如果没设置索引,没任何效果

    sectionIndexColor设置正常索引颜色

    sectionIndexBackgroundColor设置索引背景色

    sectionIndexTrackingBackgroundColor选中索引的颜色

    cellLayoutMarginsFollowReadableWidth,ios9之后,cell两侧有空白,如下设置可以去掉空白

    tableView.cellLayoutMarginsFollowReadableWidth = NO;
    

    insetsContentViewsToSafeArea

    tableHeaderView表头部视图

    tableFooterView表尾部视图

    dragInteractionEnabled是否允许拖动。默认ipad为YES,iphone为NO

    代理
    数据源代理

    @property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
    

    必须实现的两个方法

    每组多少行
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    每个cell要显示的内容
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;每个cell要显示的内容
    

    可选的

    有多少组,默认1
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 
     每组头部标题
    - (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
    每组尾部标题
    - (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
    当前行是否允许编辑,默认所有行都可以编辑
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
    
    // Moving/reordering
    
    为特定行显示reorder附件视图。默认情况下,只有数据源实现-tableView:moveRowAtIndexPath:toIndexPath时,才会显示reorder控件:
    - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
    
    // Index
    右边的索引序列(类似电话簿,ABC...Z)
    - (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView;  
    每组对应的索引序列值                            
    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  
    
    // Data manipulation - insert and delete support
    
    根据UITableViewCellEditingStyle来判断是那种行为,具体行为要在方法体内实现
    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
    
    // Data manipulation - reorder / moving support
    cell移动时会调用这个方法
    - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
    
    

    tableview的属性代理

    @property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate

    cell将要显示
    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
    HeaderView将要显示
    - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
    FooterView将要显示
    - (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
    已近显示cell
    - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
    已近显示HeaderView
    - (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
    已近显示FooterView
    - (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
    
    行高
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
    每组头部高度
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
    每组尾高度
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
    
    
    估算高度
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
    
    

    @property (nonatomic, weak, nullable) id <UITableViewDataSourcePrefetching> prefetchDataSource NS_AVAILABLE_IOS(10_0);
    iOS10开始有的
    用法和上面的代理一样,遵守协议。实现代理方法

    self.tableView.prefetchDataSource=self;
    

    实现这两个方法,第一个必须实现,会在快速滑动tableView的时候调用,方法体里用来完成一些耗时操作。
    第二个方法可选,在快速滑动tableView的时候,停下,反方向就会调用这个方法来取消耗时操作

    - (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
    - (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
    

    相关文章

      网友评论

        本文标题:UITableView使用详解

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