UITableView接口
常规
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
初始化方法,调用init
方法初始化时默认style为UITableViewStylePlain
@property (nonatomic, readonly) UITableViewStyle style;
表视图类型,包括UITableViewStylePlain
和UITableViewStyleGrouped
@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;
编辑状态下提交编辑时调用 例如在编辑状态下点击删除按钮会调用该方法并传入值为UITableViewCellEditingStyleDelete
的UITableViewCellEditingStyle
参数,然后在该方法中手动删除相关数据源和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的预估高度)。
注意:
- 预估高度纯碎是为了提升加载表视图时的性能,即首次加载的时候无需将表视图contentSize的高度通过遍历所有cell的实际高度累加计算出来,而是通过预估值来暂时估算整体高度并加载cell,当cell显示时才根据其实际高度动态更新contentSize的高度。这使得在首次加载时减少了
heightForRowAtIndexPath
方法的调用,对于包含大量cell的表视图在加载时能提升较大的性能。但有一个问题,如果预估高度和实际高度相差过大,或者各个cell之间时间高度差距较大且无规律,滚动过程中可能造成cell”上下弹跳”的困扰,影响用户体验。针对此问题的做法是通过estimatedHeightForRowAtIndexPath
定制不同cell的预估高度,如果还是不行的话干脆就不要预估了,个人认为以牺牲用户体验才成全性能是得不偿失的。 - 预估高度是无法被当成实际高度使用的,加入只设置了预估高度属性estimatedRowHeight或者实现了
estimatedHeightForRowAtIndexPath
方法,而没有设置rowHeight属性或heightForRowAtIndexPath方法,那么cell的显示高度为默认的44,而不是设置的预估高度。这里只是以cell作为说明,sectionHeaderView和sectionFooterView也是一样的。 - 如果设置了预估高度,表视图首次加载时以预估高度来决定要加载多少个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选中情况发生变化时发送的通知
坑百挑不厌
UITableView
的separatorInset
无论怎么设置分割线左边始终无法顶格,解决办法如下:-(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)]; } }
分组头/尾视图若使用系统提供的
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]]; }
在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); }
对于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; }