文档章节

UITableView那些事

卡奇匠
 卡奇匠
发布于 2017/05/24 13:04
字数 1636
阅读 46
收藏 0

UITableView那些事<一>   

tableview是iOS开发中常用的控件之一,也是出现问题比较多的控件。所以闲暇时间,我全面的写一下。
第一篇就先写写tableview的各种属性和方法吧

一、Configuring a TableView

1.初始化方法  - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style

2.样式属性  @property(nonatomic, readonly) UITableViewStyle style

3.返回section下得row的个数   - (NSInteger)numberOfRowsInSection:(NSInteger)section

4.返回section的个数(只读)@property(nonatomic, readonly) NSInteger numberOfSections

5.cell的高度  @property(nonatomic) CGFloat rowHeight

6.设置分割线  @property(nonatomic) UITableViewCellSeparatorStyle separatorStyle
有3种样式UITableViewCellSeparatorStyleNone,         UITableViewCellSeparatorStyleSingleLine,UITableViewCellSeparatorStyleSingleLineEtched
   默认第二种,1、3都是不显示分割线的,3只支持分组的情况,这个属性用的不多,用tableview直接调用即可。

7.设置分割线的颜色 @property(nonatomic, strong) UIColor *separatorColor

8.分割线设置毛玻璃效果  @property(nonatomic, copy) UIVisualEffect *separatorEffect
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
  UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
_tableView.separatorEffect = vibrancyEffect;
  我看着效果不大,这个用的更少,,,iOS8以后使用

9.设置tableview的背景图片  @property(nonatomic, strong) UIView *backgroundView

10.设置分割线的填充  @property(nonatomic) UIEdgeInsets separatorInset
_tableView.separatorInset = UIEdgeInsetsMake(0, 3, 0, 11);如果你直接这样设置,用处不大,分割线的左边不会顶格,右边也不会无限的缩进 这是因为cell有个属性             preservesSuperviewLayoutMargins 防止继承tableview的margin设置解决方法:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath[pre]{
// Remove seperator inset
if([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsMake(0, 80, 0, 120)];
}
// 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, 80, 0, 120)];
}
}  这样  分割线的长度 随意控制 想怎么改变怎么改变

11.这也是关于 分割线的一个设置 @property(nonatomic) BOOL cellLayoutMarginsFollowReadableWidth
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) {
_tableView.cellLayoutMarginsFollowReadableWidth = NO;
   }这个设置iOS9以后才有,好像主要针对iPad,不设置的话,分割线左侧空出很多,不做太多探究

二、Creating TableViewCells
1. 用xib注册cell - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

2. 用类注册cell  - (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier

3. cell的重用根据identifie,可以根据indexPath确定那个cell - (__kindofUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifie forIndexPath:(NSIndexPath *)indexPath

4. - (__kindofUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier

三、Accessing Header and Footer Views

1. (功能同上) - (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier

2. (功能同上) - (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier

3.     用于注册过的headerView或则footerView                  - (__kindofUITableViewHeaderFooterView *)dequeueReusableHeaderFooterViewWithIdentifier:(NSString*)identifier

4.@property(nonatomic, strong) UIView *tableHeaderView

5.@property(nonatomic, strong) UIView *tableFooterView

6.@property(nonatomic) CGFloat sectionHeaderHeight

7.@property(nonatomic) CGFloat sectionFooterHeight

8.- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section

 9.- (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section
上面几个属性和方法大家一目了然,没有什么说的

四、 Accessing cells and Sections

1. - (__kindofUITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

2.获取cell的indexPath  - (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell
  比如cell上面有个button,点击button的时候,可以获取button所在cell的indexPath
- (void)btnAction:(UIButton *)btn{
TableViewCell*cell = (TableViewCell*)[[btn superview] superview];
NSIndexPath*indexPath = [_tableViewindexPathForCell:cell];
NSLog( @"%@",indexPath);
   }TableViewCell我是用的xib

3.根据给的point返回cell的indexPath - (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point
只返回一个indexPath,比如cell的高度是80,point是{0,280},indexPath.row = 3

4.返回rect区域内的所有的indexPath的集合 - (NSArray<NSIndexPath *> *)indexPathsForRowsInRect:(CGRect)rect

5.返回屏幕中所有可见的cell的数组 @property(nonatomic, readonly) NSArray <__kindof UITableViewCell *> *visibleCells

6. 同上 都是返回屏幕中可见cell的数组 @property(nonatomic, readonly) NSArray <NSIndexPath *> *indexPathsForVisibleRows

五、 Estimating Element Heights

1.  @property(nonatomic) CGFloat estimatedRowHeight

2.@property(nonatomic) CGFloat estimatedSectionHeaderHeight

3.@property(nonatomic) CGFloat estimatedSectionFooterHeight
  上面这3个属性都是,预估高度值,加载cell的时候,系统先去判断cell的高度,浪费大量的时间,有多少cell就会加载多少次cell高度的方法。
  用预估值会节省加载时间,但是这样也会出现一个问题,
  以cell为例,系统会根据estimatedRowHeight创建cell,到真正显示的时候,系统会根据self-sizing计算出size,并调整tableView的content size,
绘制cell。给个链接,有兴趣的可以看下,http://www.tuicool.com/articles/mQjeM3z

五、 Scrolling the TableView

1. 自动滚动tableView到你指定的cell处   - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:   (UITableViewScrollPosition)scrollPosition animated:(BOOL)animated 这里还有一种方法滚动tableview,就是他的父类scrollview的方法   setContentOffset

2.在cell选中的方法里写这个方法,选中cell的时候会滚动到你指定的地方   - (void)scrollToNearestSelectedRowAtScrollPosition:   (UITableViewScrollPosition)scrollPosition animated:(BOOL)animated

六、Managing Selections

1.得到选中的cell的indexPath @property(nonatomic, readonly) NSIndexPath *indexPathForSelectedRow

2.同上 @property(nonatomic, readonly) NSArray <NSIndexPath *> *indexPathsForSelectedRows

3. 自动选中你所指定的indexPath的cell,并且滑动到那个cell       - (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated: (BOOL)animated scrollPosition: (UITableViewScrollPosition)scrollPosition

4.当点击cell的时候push到下个VC的时候,再回来还是选中状态,这个函数就是返回后取消选中状态  
  - (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated

5.是否允许cell被选中 @property(nonatomic) BOOL allowsSelection

6.是否允许cell多选  @property(nonatomic) BOOL allowsMultipleSelection

7.cell在编辑模式下,是否允许被选中@property(nonatomic) BOOL allowsSelectionDuringEditing

8.cell在编辑模式下,是否允许被多选@property(nonatomic) BOOL allowsMultipleSelectionDuringEditing

七、Inserting,Deleting,and Moving Rows and Sections

1.  - (void)beginUpdates
2.- (void)endUpdates 上面两个方法成对使用,是在cell删除、添加等的时候使用的动画

3. - (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

4.   - (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
5.- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath
6. - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
7.- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
8.- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection
上面这几个方法,看名字就知道什么意思了,就是cell的添加、删除、移动

八、Managing the Editing of Table Cells

1.  @property(nonatomic, getter=isEditing) BOOL editing

2. - (void)setEditing:(BOOL)editing animated:(BOOL)animate
     上面两个方法,设置cell是否可被编辑

九、Reloading the TableView

1.  刷新整个表视图 - (void)reloadData

2.刷新指定的indexPath,可以是数组 - (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation

3.刷新指定的section - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

4. 刷新索引  - (void)reloadSectionIndexTitles

十、Accessing Drawing Areas of the TableView

1. 返回指定的section的坐标 - (CGRect)rectForSection:(NSInteger)section

2.返回指定的indexPath的坐标 - (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath

3.返回指定section的footerView的坐标 - (CGRect)rectForFooterInSection:(NSInteger)section

4.返回指定section的headerView的坐标 - (CGRect)rectForHeaderInSection:(NSInteger)section

十一、Managing the Delegate and the DataSource

1.@property(nonatomic, weak) id< UITableViewDataSource > dataSource

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

十二、Configuring the Table Index

1.Index Row Limit属性与UITableView的sectionIndexMinimumDisplayRowCount有关,这个属性的含义是:"当行数达到某个数值,则显示索引栏"。(索引栏是通      过 sectionIndexTitlesForTableView方法来实现的)。@property(nonatomic)NSInteger sectionIndexMinimumDisplayRowCount

2.改变索引栏字体的颜色@property(nonatomic, strong) UIColor *sectionIndexColor

3.改变索引栏的背景颜色@property(nonatomic, strong) UIColor *sectionIndexBackgroundColor

4.改变点击索引栏的背景颜色(点击之后恢复原状态)@property(nonatomic, strong) UIColor *sectionIndexTrackingBackgroundColor

十三、Managing Focus

1.@property(nonatomic) BOOL remembersLastFocusedIndexPath

十四、Notifications

1.UITableViewSelectionDidChangeNotification

© 著作权归作者所有

共有 人打赏支持
卡奇匠
粉丝 23
博文 67
码字总数 68740
作品 0
海淀
程序员
私信 提问
iOS UITableView代理方法详解

iOS UITableView的代理方法详解 一、补充 在上一篇博客中,http://my.oschina.net/u/2340880/blog/404605,我将IOS中tableView(表视图)的一些常用方法总结了一下,这篇将tableView的代理方法...

珲少
2015/04/22
0
2
关于UITableViewCell和UITableView之间的消息传递

问题:当UITableViewCell中发生点击事件(或者其他事件)时,它是如何通知UITableView然后调用UITableView的delegate呢? 详细描述:UITableViewCell中没有属性可以设置它所在的UITableView...

罗包子
2015/04/13
311
0
UITableView 一些方法

1. UITableView的初始化 [csharp] view plain copy UITableView tableview= [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)]; [tableview setDelegate:self]; [tableview s......

晨曦之光
2012/05/16
852
0
UI_09 UITableView(表视图)

⼀、表视图 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView。UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳 1、表示图的样式 UITableViewStylePlain UITa...

黑伞将军
2015/08/26
0
0
UITableView的优化原理

当我们下啦一个 UITableView时,如果没有做优化,只是简单的实现功能代码如下,这样当我们有上百条tableviewcell的时候,我们滑动的非常快时会非常费内存,当然苹果公司不会让我们这样干,苹...

哥特复心
2013/11/29
0
3

没有更多内容

加载失败,请刷新页面

加载更多

JeeSite4.x 消息管理、消息推送、消息提醒

实现统一的消息推送接口,包含PC消息、短信消息、邮件消息、微信消息等,无需让所有开发者了解消息是怎么发送出去的,只需了解消息发送接口即可。 所有推送消息均通过 MsgPushUtils 工具类发...

ThinkGem
6分钟前
0
0
OpenML

https://www.openml.org/search?type=data

shengjuntu
8分钟前
0
0
java强引用,软引用,弱引用和虚引用

先来简要说一下这四种引用的特性: 强引用:如果一个对象具有强引用,那垃圾回收器绝不会回收它 软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它 弱引用:在垃圾...

woshixin
12分钟前
0
0
dubbo服务在kubernetes中对外暴露服务

一些场景下,在开发时可能存在dubbo consumer需要访问k8s中部署的dubbo provider,尤其是对于自建的kubernetes集群环境,tcp的端口很难代理,这就导致了开发发链接集群内的服务比较麻烦,这里...

上官胡闹
22分钟前
0
0
Java获取小程序带参二维码(太阳码)

获取小程序码 官方API地址 : https://developers.weixin.qq.com/miniprogram/dev/api/qrcode.html 首先使用官方提供的 接口B:适用于需要的码数量极多的业务场景 https://api.weixin.qq.com/...

回忆是如此忧伤
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部