UITableView API大百科

UITableView接口

常规

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style

初始化方法,调用init方法初始化时默认style为UITableViewStylePlain

@property (nonatomic, readonly) UITableViewStyle style;

表视图类型,包括UITableViewStylePlainUITableViewStyleGrouped

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

数据源对象

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

代理对象

@property (nonatomic) CGFloat rowHeight;
@property (nonatomic) CGFloat sectionHeaderHeight;
@property (nonatomic) CGFloat sectionFooterHeight;

默认cell/sectionHeaderView/sectionFooterView高度

@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0);
@property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0);
@property (nonatomic) CGFloat estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0); 

cell/sectionHeaderView/sectionFooterView预估高度。关于预估高度,在下面介绍定制预估高度的代理方法时做较详细说明。

数据

- (void)reloadData; 

重新加载表视图

- (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0);

重新加载索引

信息

@property (nonatomic, readonly) NSInteger numberOfSections;

分组数

- (NSInteger)numberOfRowsInSection:(NSInteger)section;

返回指定分组的行数

- (CGRect)rectForSection:- (NSInteger)section;                                    // includes header, footer and all rows
- (CGRect)rectForHeaderInSection:(NSInteger)section;
- (CGRect)rectForFooterInSection:(NSInteger)section;
- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;

获取分组、分组头视图、分组尾视图、行所在的Rect

- (nullable NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point; 

获取指定坐标的cell行的索引,若坐标不落在cell上返回nil

- (nullable NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;

获取指定cell的索引

- (nullable NSArray<NSIndexPath *> *)indexPathsForRowsInRect:(CGRect)rect; 

获取指定rect区域的cell索引数组

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;

获取指定索引的cell,若对应的cell当前未显示,返回nil

@property (nonatomic, readonly) NSArray<__kindof UITableViewCell *> *visibleCells;

返回屏幕中可见cell的数组

@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForVisibleRows;

返回屏幕中可见cell的索引对象数组

- (nullable UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (nullable UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);

获取指定分组的头视图/尾视图

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

滚动到指定索引对应的cell处。scrollPosition枚举参数用来指定目标cell滚动的目标位置

typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {

UITableViewScrollPositionNone, //就近原则

UITableViewScrollPositionTop, //滚到视图上方

UITableViewScrollPositionMiddle, //滚到中间

UITableViewScrollPositionBottom //滚到视图下方

};

- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

滚动到当前选中的cell处,参数scrollPosition同上

更新

- (void)beginUpdates;
- (void)endUpdates; 

用来批量操作插入删除等更新,或者用来动态更新行高

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);

对分组操作插入、删除、重载、移动

- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);

对行操作插入、删除、重载、移动

编辑

@property (nonatomic, getter=isEditing) BOOL editing;                             // default is NO. setting is not animated.

编辑状态,getter方法判断是否处于编辑状态,setter方法设置编辑状态,无动画

- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

置标视图为编辑状态,可设置动画效果

选择

@property (nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0);

允许选中cell,默认YES

@property (nonatomic) BOOL allowsSelectionDuringEditing;

编辑状态下是否允许选中,默认NO

@property (nonatomic) BOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0);

是否允许多选,默认NO

@property (nonatomic) BOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0);

编辑状态下是否允许多选

@property (nonatomic, readonly, nullable) NSIndexPath *indexPathForSelectedRow;

获取当前选中的cell的索引

@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForSelectedRows

获取当前选中的cell的索引数组(多选模式)

- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;

选中指定cell并滚动到cell所在位置,scrollPosition参数为cell最终所处位置

- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;

取消对指定cell的选中

显示

@property (nonatomic, strong, nullable) UIView *backgroundView NS_AVAILABLE_IOS(3_2); 

设置背景视图(位于contentView上层,cell和sectionView下层)

@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle

分割线style

@property (nonatomic, strong, nullable) UIColor *separatorColor

分割线颜色

@property (nonatomic, copy, nullable) UIVisualEffect *separatorEffect

设置毛玻璃效果 iOS8才能用,这里暂时不做探究

@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0)

分割线缩进量

@property (nonatomic) BOOL cellLayoutMarginsFollowReadableWidth NS_AVAILABLE_IOS(9_0);

网上说iOS9中这个属性不设置为NO的话Cell分割线左边会空出很多,实际测试中并没有出现这种现象??尚不清楚该属性的作用

@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;

能够显示索引栏的最小cell数(总) 默认为0

@property (nonatomic, strong, nullable) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) 

索引栏标题字体颜色

@property (nonatomic, strong, nullable) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) 

索引栏背景颜色(正常状态)

@property (nonatomic, strong, nullable) UIColor *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0)

索引栏背景颜色(触摸状态)

@property (nonatomic, strong, nullable) UIView *tableHeaderView;

表视图的头视图(不要和sectionHeaderView混淆)

@property (nonatomic, strong, nullable) UIView *tableFooterView;

表视图的尾视图(不要和sectionFooterView混淆)

其他

- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);

用Xib注册cell

- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

用类注册cell

- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

重用cell

- (void)registerNib:(nullable UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

用Xib注册分组头尾视图

- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

用类注册分组头尾视图

- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

分组头尾视图出队

UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

返回每个分组的行数

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

返回用于构建表视图的指定索引处的cell

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

返回分组数

- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

返回指定sectionHeaderView/sectionFooterView的标题,实现该代理方法会默认创建用于显示标题的sectionHeaderView/sectionFooterView(会被自定义的覆盖)。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

返回指定行是否可编辑,默认全部可编辑

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

要实现编辑状态下可移动cell必须实现该方法,在编辑状态下会有移动控制按钮

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

根据indexPath指定可移动的cell项,默认全部可移动

- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView __TVOS_PROHIBITED;

返回(显示在表视图右边缘的)分组索引栏标题数组

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index __TVOS_PROHIBITED;

点击索引栏标题时调用,传入两个参数

title:索引标题

index:索引在titleForHeaderInSection返回的数组中的index

默认索引栏中的标题从上到下一次和tableview中的section从上到下逐个对应,通过该方法可以定制对应关系

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

编辑状态下提交编辑时调用 例如在编辑状态下点击删除按钮会调用该方法并传入值为UITableViewCellEditingStyleDeleteUITableViewCellEditingStyle参数,然后在该方法中手动删除相关数据源和cell。

注意: 如果想实现左划cell进入删除状态,必须实现该方法!

NOTE:

To enable the swipe-to-delete feature of table views (wherein a user swipes horizontally across a row to display a Delete button), you must implement the tableView:commitEditingStyle:forRowAtIndexPath: method.

UITableViewDelegate

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);

cell/sectionHeaderView/sectionFooterView显示/隐藏时相关调用

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

返回指定cell/sectionHeaderView/sectionFooterView的高度,会覆盖对应的rowHeight/sectionHeaderHeight/sectionFooterHeight属性(在这里定制不同cell的高度)。

- (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);

返回指定cell/sectionHeaderView/sectionFooterView的预估高度,会覆盖对应的estimatedRowHeight/estimatedSectionHeaderHeight/estimatedSectionFooterHeight属性(在这里定制不同cell的预估高度)。

注意

  1. 预估高度纯碎是为了提升加载表视图时的性能,即首次加载的时候无需将表视图contentSize的高度通过遍历所有cell的实际高度累加计算出来,而是通过预估值来暂时估算整体高度并加载cell,当cell显示时才根据其实际高度动态更新contentSize的高度。这使得在首次加载时减少了heightForRowAtIndexPath方法的调用,对于包含大量cell的表视图在加载时能提升较大的性能。但有一个问题,如果预估高度和实际高度相差过大,或者各个cell之间时间高度差距较大且无规律,滚动过程中可能造成cell”上下弹跳”的困扰,影响用户体验。针对此问题的做法是通过estimatedHeightForRowAtIndexPath定制不同cell的预估高度,如果还是不行的话干脆就不要预估了,个人认为以牺牲用户体验才成全性能是得不偿失的。
  2. 预估高度是无法被当成实际高度使用的,加入只设置了预估高度属性estimatedRowHeight或者实现了estimatedHeightForRowAtIndexPath方法,而没有设置rowHeight属性或heightForRowAtIndexPath方法,那么cell的显示高度为默认的44,而不是设置的预估高度。这里只是以cell作为说明,sectionHeaderView和sectionFooterView也是一样的。
  3. 如果设置了预估高度,表视图首次加载时以预估高度来决定要加载多少个cell的。例如设置了每个cell的预估高度为50,设置了实际高度为100,那么对于一个frame高度为500的表视图,首次加载是加载10个cell(500/50),而不是5个(500/100)。其实明白了预估高度的机制就不难明白其原因。
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   // custom view for header. will be adjusted to default or specified header height
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section; 

自定义sectionHeaderView/sectionFooterView,系统提供了用于显示section标题的UITableViewHeaderFooterView(继承自UIView),当然也可以根据实际需要自定义。若返回的是UITableViewHeaderFooterView实例,其标题由titleForHeaderInSection/titleForFooterInSection决定。

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath NS_DEPRECATED_IOS(2_0, 3_0) __TVOS_PROHIBITED;

定制cell附件

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;

点击cell附件按钮时回调

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

定制点击cell时能否高亮以及监控高亮过程

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;

当点击某一行时可以自定义选中其他行,参数indexPath为当前所点击行的索引。默认返回indexPath,返回nil则不选中

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);

点击某行时取消指定行的选中。返回nil相当于实现了多选的功能,当allowsMultipleSelection属性为YES时该方法永远不会被调用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);

监控cell选中过程

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

定制cell的编辑类型,返回枚举常量。不实现该方法默认所有编辑类型为删除类型(UITableViewCellEditingStyleDelete)。该方法配合tableView: commitEditingStyle: forRowAtIndexPath:使用。

typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {

UITableViewCellEditingStyleNone, //无编辑类型

UITableViewCellEditingStyleDelete, //删除

UITableViewCellEditingStyleInsert //插入

};

- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath;

定制编辑类型为删除模式下删除按钮的标题

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;

iOS8后可用。在编辑状态下左滑cell默认可现实一个delete按钮,上一个方法可以对delete按钮标题进行自定义,这个方法则可以对按钮完全自定义。

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;

设置在编辑状态下cell是否缩进 经测试只对cell多选编辑模式下有作用

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;

当cell允许编辑且editingStyleForRowAtIndexPath设置的编辑模式为删除模式时,左划cell能够进入指定cell的编辑模式显示删除按钮,这时回调willBeginEditingRowAtIndexPath方法。右划退出编辑模式时回调didEndEditingRowAtIndexPath

注意:通过设置editing属性进入编辑模式并不会回调这两个方法。

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;  

移动cell时,默认为移动到当前手指所在处的cell处,通过该方法可以自定义移动cell的目标位置。

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;

用于设置cell内容的缩进级别

- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0);
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0);
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0);

这3个方法必须全部实现,才能实现通过长按cell弹出编辑菜单拷贝粘贴cell内容。

常量

UIKIT_EXTERN NSString *const UITableViewIndexSearch;

将该常量包含在sectionIndexTitlesForTableView:返回的section index的数组中,显示一个放大镜图标。通常将该常量作为数组的第一个元素,以点击时回到最上方搜索框。

UIKIT_EXTERN const CGFloat UITableViewAutomaticDimension NS_AVAILABLE_IOS(5_0);

分局自动布局自动计算高度,iOS8中通过将rowHeight的值设置为它可以自cell自动布局的基础上自动计算cell高度(前提是同时设置了estimatedHeight)。

UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification;

当cell选中情况发生变化时发送的通知

坑百挑不厌

  1. UITableViewseparatorInset无论怎么设置分割线左边始终无法顶格,解决办法如下:

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    // Remove seperator inset
    if([cell respondsToSelector:@selector(setSeparatorInset:)]){
        [cell setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    }
    // Prevent the cell from inheriting the Table View‘s margin settings
    if([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]){
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
    // Explictly set your cell‘s layout margins
    if([cell respondsToSelector:@selector(setLayoutMargins:)]){
        [cell setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)];
    }
    }
  2. 分组头/尾视图若使用系统提供的UITableViewHeaderFooterView创建,无法直接设置标题的字体颜色,可以在willDisplayHeaderView方法中设置。简直莫名其妙!
    - (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    //使用系统的UITableViewHeaderFooterView
    UITableViewHeaderFooterView *headerView = [[UITableViewHeaderFooterView alloc]initWithReuseIdentifier:@"SectionHeaderView"];
    headerView.contentView.backgroundColor = [UIColor yellowColor];  //不能直接设置headerView的backgroundColor
    [headerView.textLabel setTextColor:[UIColor greenColor]];  //直接设置字体颜色没效果 只能在willDisplayHeaderView方法中设置
    headerView.textLabel.text = [NSString stringWithFormat:@"%zd",section];
    return headerView;
    }
    
    - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
    UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view;
    [headerView.textLabel setTextColor:[UIColor orangeColor]];
    }
  3. 在tableView的style为plain的情况,若设置了sectionHeaderView或sectionFooterView,滑动过程中会始终悬浮在表视图顶端或末尾,让sectionHeaderView不悬停的方法:
    CGFloat sectionHeaderHeight = 50;
    if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0) {
    scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
    } else if (scrollView.contentOffset.y >= sectionHeaderHeight) {
    scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
    }
  4. 对于style未group的tableView,系统自动设置了sectionHeaderView和sectionViewFooter,使得section之间有明见的间距。可以通过自定义sectionHeaderView/sectionViewFooter的高度达到想要的效果。
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return CGFLOAT_MIN;  //注意若返回0则显示默认高度
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return CGFLOAT_MIN;
    }
时间: 2024-11-12 06:01:45

UITableView API大百科的相关文章

Swift在1.2版本的变化

从Xcode 6.3 Beta Release Notes看出,Xcode 6.3 Beta包含了很多颇为值得开发者期待的改变,共计50多处改动,同时修改了Objective-C的语法,足见苹果对Swift语言的重视.而其代码迁移工具可以帮助开发者将其代码从Swift 1.1(Xcode 6.1)升级至Swift 1.2(Xcode 6.3),具体执行编辑菜单(Edit)->转换(Convert)-至(To)Swift1.2即可. 具体更新如下: Swift语言的增强 Swift现在支持目标增量

[IOS] - UITableView 与 UICollectionView API及其使用

UITableView 表视图 是IOS使用非常频繁的布局视图 UITableView 什么样子呢? 一般用在什么地方呢?看下边的图 像是电话薄,好友列表 这种列表排列的视图一般都是使用UITableView实现的 UITableView 一共包含两种内置的布局格式: UITableViewStylePlain 普通的表格样式(默认) UITableViewStyleGrouped 带有分组的表格样式 在项目中如何使用UITableView,UITableView相较于其他基础视图对象使用还是稍

iOS开发——仿Clear纯手势操作的UITableView

前言 在Clear应用中,用户无需任何按钮,纯靠不同的手势就可以完成对ToDoItem的删除.完成.添加.移动.具体来说,功能上有左划删除,右划完成,点击编辑,下拉添加.捏合添加.长按移动.这里将这些功能实现并记录. 左划删除与右划完成 所谓的左右滑动,就是自定义一个cell然后在上面添加滑动手势.在处理方法中计算偏移量,如果滑动距离超过cell宽度一半,就删除它,或者是为文本添加删除线等来完成它:如果没有超过一半,那么就用动画把cell归位. 效果图如下: 关键代码如下: - (void)ha

UITableView加载网络数据的优化

效果 源码 https://github.com/YouXianMing/Animations // // TableViewLoadDataController.m // Animations // // Created by YouXianMing on 16/2/2. // Copyright © 2016年 YouXianMing. All rights reserved. // #import "TableViewLoadDataController.h" #import &

iOS UITableview的cell自适应

背景:这几天做项目,又遇到了cell的自适应高度问题 首先我们必须要知道UITableViewcell 的代理执行顺序,在iOS7出现了一个代理方法叫:tableView: estimatedHeightForRowAtIndexPath:,首先我们要知道在使用UITableViewcell的时候必须计算cell的高度,那如果cell的内容是动态的呢?这个时候我们就必须动态的返回高度了,这就回到了我们项目中遇到的问题.知道了这一点,接下来我们就必须知道UITableViewde 的代理方法的执行

iOS开发——实战篇Swift篇&amp;UItableView结合网络请求,多线程,数据解析,MVC实战

UItableView结合网络请求,多线程,数据解析,MVC实战 学了这么久的swift都没有做过什么东西,今天就以自己的一个小小的联系,讲一下,怎么使用swift在实战中应用MVC,并且结合后面的高级知识:网络请求,JSON数据解析一起应用到一个项目中来. 好了,废话不多说,我们直接开始吧. 首先看看最终的效果: 是不是很简单,就是个UItableView显示一些简单的数据,如果你真的觉得太简单了,那么请绕道,寻找更深入东西,但或者没有你想的那么简单,这不仅仅是一个tableView,为什么呢

IOS 控件 - UITableView 中的cell 自适应高度

当 UITableView 中有一个 label 的内容比较长的时候,就需要 cell 自适应高度来多行展示label: 首先设置 label 的 line 为0: 代码如下: // 为每一个 cell 预设置一个高度,可以提高效率 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } // 这里每一个 cell

Swift与Objective-C API的交互

互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 Cocoa 应用的方案. 互用性很重要的一点就是允许你在写 Swift 代码时使用 Objective-C 的 API 接口.当你导入一个 Objective-C 框架后,你可以使用原生的 Swift 语法实例化它的 Class 并且与之交互. 初始化 为了使用 Swift 实例化 O

UITableView的优化策略

UITableView作为iOS开发中最重要和常用的控件之一,其中的实现原理很是考究.苹果软件在这块的优化水平直接决定了iOS的体验性能甩安卓几条街,Table view需要有很好的滚动性能,不然用户会在滚动过程中发现动画的瑕疵.然而在使用第三方应用时,却经常遇到性能上的问题,普遍表现在滚动时比较卡,特别是table cell中包含图片的情况时.实际上只要针对性地优化一下,这种问题就不会有了.有兴趣的可以看看LazyTableImages这个官方的例子程序,虽然也要从网上下载图片并显示,但滚动时