tableView

本文详细介绍了UITableView的两种样式及其基本结构,包括头部、尾部和单元格的设置方法,并提供了UITableView常用属性与方法的示例。

1.UITableView有两种样式:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片

1.UITa

  1. [[UITableView alloc] initWithFrame:view.bounds style:UITableViewStylePlain];
  2. [[UITableView alloc] initWithFrame:view.bounds style:UITableViewStyleGrouped];  
2.UITableView的结构:

UITableView由头部,尾部,和中间一连串的单元格组成,UITableView的头部由tableHeaderView属性设置,尾部由tableFooterView属性设置,中间的

行高可通过rowHeight属性设置

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. _listArray = [[UIFont familyNames] retain];//获取所有字体名称  
  2.   
  3. _tableView = [[UITableView alloc] initWithFrame:view.bounds style:UITableViewStylePlain];  
  4. // 设置数据源  
  5. _tableView.dataSource = self;  
  6. // 设置代理  
  7. _tableView.delegate = self;  
  8. // 设置表视图cell的高度,统一的高度  
  9. _tableView.rowHeight = 70;    // 默认44px  
  10. // 设置表视图的背景  
  11. UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IMG_0410"]];  
  12. _tableView.backgroundView = backgroundView;  
  13. [backgroundView release];  
  14. // 设置表视图的颜色  
  15.   _tableView.backgroundColor = [UIColor yellowColor];  
  16. // 设置表视图的分割线的颜色  
  17.   _tableView.separatorColor = [UIColor purpleColor];  
  18. // 设置表视图的分割线的风格  
  19. _tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;  
  20. // 设置表视图的头部视图(headView 添加子视图)  
  21. UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0032080)];  
  22. headerView.backgroundColor = [UIColor redColor];  
  23. // 添加子视图  
  24. UILabel *headText = [[UILabel alloc] initWithFrame:CGRectMake(60020080)];  
  25. headText.text = @"天晴朗,天晴朗天晴朗天晴朗!";  
  26. headText.numberOfLines = 0;  
  27. [headerView addSubview:headText];  
  28. [headText release];  
  29. _tableView.tableHeaderView = headerView; //设置头部  
  30. [headerView release];  
  31. // 设置表视图的尾部视图(footerView 添加子视图)      
  32. UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0032080)];  
  33. footerView.backgroundColor = [UIColor yellowColor];  
  34. _tableView.tableFooterView = footerView;  //设置尾部  
  35. [footerView release];  

UITableView的一些常用属性

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //设置UITableView分割线风格  
  2. @property(nonatomic) UITableViewCellSeparatorStyle separatorStyle;   
  3. //设置UITableView分割线颜色,默认为标准灰色  
  4. @property(nonatomic,retain) UIColor               *separatorColor;    
  5. //设置UITableView的头部  
  6. @property(nonatomic,retainUIView *tableHeaderView;   
  7. //设置UITableView的尾部  
  8. @property(nonatomic,retainUIView *tableFooterView;   
  9. //设置UITableView的Cell的高度  
  10. @property (nonatomic)          CGFloat                     rowHeight;  
  11. //设置UITableView种section的头部的高度  
  12. @property (nonatomic)          CGFloat                     sectionHeaderHeight;  
  13. //设置UITableView种section的尾部的高度  
  14. @property (nonatomic)          CGFloat                     sectionFooterHeight;  
  15. //设置UITableView的背景  
  16. @property(nonatomicreadwriteretainUIView *backgroundView NS_AVAILABLE_IOS(3_2);  
  17. //设置UITableView是否可编辑,默认为no,不可编辑  
  18. @property(nonatomic,getter=isEditing) BOOL editing;   
  19. - (void)setEditing:(BOOL)editing animated:(BOOL)animated;//方法带有动画效果  
  20. //当UITableView不在编辑时,cell是否可以选中,默认为yes  
  21. @property(nonatomicBOOL allowsSelection NS_AVAILABLE_IOS(3_0);    
  22. //当UITableView在编辑时,cell是否可以选中,默认为no  
  23. @property(nonatomicBOOL allowsSelectionDuringEditing;      
  24. //当UITableView不在编辑时,cell是否可以选中多个,默认为no                                  
  25. @property(nonatomicBOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0);    
  26. //当UITableView在编辑时,cell是否可以选中多个,默认为no  
  27. @property(nonatomicBOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0);   

UITableView的一些常用方法:

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //整体刷新UITableView  
  2. - (void)reloadData;   

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //指定一个cell,返回一个NSIndexPath,如果cell没有,返回nil  
  2. - (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;   
  3. //指定一个范围,返回一组NSIndexPath,如果rect无效,返回nil  
  4. - (NSArray *)indexPathsForRowsInRect:(CGRect)rect;   
  5. //指定一个NSIndexPath,返回一个cell  
  6. - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;   
  7. //返回所有显示的cell  
  8. - (NSArray *)visibleCells;  
  9. //返回所有显示的cell的NSIndexPath  
  10. - (NSArray *)indexPathsForVisibleRows;  


UITableView的一些编辑方法:
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //插入一个cell到指定的indexPaths位置,指定一个动画效果  
  2. - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;  
  3. //删除indexPaths位置的cell,指定一个动画效果  
  4. - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;  
  5. //刷新indexPaths位置的cell,指定一个动画效果(tableView的局部刷新,一般用于cell的位置不改变,又不想刷新整个tableView时)  
  6. - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);  
  7. //移动indexPaths位置的cell,指定一个动画效果  
  8. - (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);  
UITableView数据源方法

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //UITableView有多少个组  
  2. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{  
  3.     return 1;//默认为1  
  4. }  
  5. //UITableView每组有多少条数据  
  6. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;  
  7. {  
  8.     return [_listArray count];  
  9. }   
  10.   
  11. //创建一个cell  
  12. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  13. {  
  14.     static NSString *cellIdentifier = @"cell";  
  15.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];  
  16.     if (cell == nil) {  
  17.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];  
  18.     //cell的四种样式  
  19.     //UITableViewCellStyleDefault,       只显示图片和标题  
  20.        //UITableViewCellStyleValue1,        显示图片,标题和子标题(子标题在右边)  
  21.        //UITableViewCellStyleValue2,        标题和子标题  
  22.        //UITableViewCellStyleSubtitle       显示图片,标题和子标题(子标题在下边)  
  23.   
  24.     }  
  25.     // 指向其中一行  
  26. //    cell.textLabel.text = [self.listArray objectAtIndex:indexPath.row];//设置cell的标题  
  27.     cell.textLabel.textColor = [UIColor redColor];//设置标题字体颜色  
  28.     cell.textLabel.font = [UIFont fontWithName:fontName size:18];//设置标题字体大小  
  29.     cell.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]];//设置cell的图片  
  30.     cell.detailTextLabel = @"detailTextLabel"// 设置cell的子标题  
  31.     return cell;  
  32.       
  33. }   
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //设置组头部的文字  
  2. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;   
  3. //设置组尾部的文字  
  4. - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;  
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //指定cell是否可编辑  
  2. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;  
  3. //指定cell是否可移动  
  4. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;  
  5. //提交编辑操作,重写此方法,自动实现cell左滑动删除功能  
  6. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;  
  7. // 移动cell  
  8. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;  

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //右边索引显示的内容  
  2. - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView  
  3. {  
  4.     return _keyArray;  
  5. }   
  6. // 点击右边索引跳转到哪个index位置  
  7. - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index  
  8. {  
  9.     return index;  
  10. }   

UITalbeView常用的代理方法

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //cell的行高  
  2. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;  
  3. //组头部的高度  
  4. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;  
  5. //组尾部的高度  
  6. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;  
  7. //自定义组头部视图,此方法和数据源中设置头部标题的方法只能实现一个  
  8. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   // custom view for header. will be adjusted to default or specified header height  
  9. //自定义组尾部视图,此方法和数据源中设置尾部标题的方法只能实现一个  
  10. - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;    
  11. //点击cell时调用  
  12. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;  
  13. //取消点击cell时调用  
  14. - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);  

UITableViewCell的一些辅助功能

//sell的选中样式

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cell.selectionStyle = UITableViewCellSelectionStyleBlue;  

如果想选中后取消,在didSelectRowAtIndexPath方法中调用

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [tableView deselectRowAtIndexPath:indexPath animated:YES];或  
  2. [self performSelector:@selector(deselectRowAtIndexPath:animated:) withObject:indexPath afterDelay:.5];  

如果想在cell的右边出现选中状态或箭头可以设置下面的属性

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. cell.accessoryType = UITableViewCellAccessoryCheckmark;  

cell根据文字的多少自适应高度

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     // wrong  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];  
  4.     NSString *text = [_listArray objectAtIndex:indexPath.row];  
  5.     //320为文字显示的宽度,高度1000是随便写的,会自动根据文字的大小和宽度计算出高度  
  6.     CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(3201000)];  
  7.     // +20是为了让每个cell之间有些间隔  
  8.     return size.height+20;  
  9. }  

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.     //这样写在IOS7.0以后 TableViewCell的分割线就不会往右挫15个像素点了  
  2.    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];  
  3. [tableViewsetSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];  

### 实现 UITableView 的 SectionHeaderView 悬停效果 在 iOS 开发中,`UITableView` 是一个广泛使用的组件,用于展示数据列表。开发者经常需要对 `UITableView` 的 `SectionHeaderView` 进行自定义,以实现特定的视觉效果和交互体验。其中,悬停效果(sticky header)是一个常见的需求。这种效果可以让 `SectionHeaderView` 在用户滚动列表时保持在屏幕顶部,直到下一个 `SectionHeaderView` 取代它。 实现这一效果的关键在于对 `UITableView` 的 `sectionHeaderHeight` 和 `estimatedSectionHeaderHeight` 进行设置,并利用 `UITableViewDelegate` 中的 `tableView(_:viewForHeaderInSection:)` 方法来返回自定义的视图。 #### 设置 UITableView 的 Header 高度 首先,需要设置 `UITableView` 的 `sectionHeaderHeight` 和 `estimatedSectionHeaderHeight` 属性,以便正确计算和显示 `SectionHeaderView`。 ```swift override func viewDidLoad() { super.viewDidLoad() tableView.sectionHeaderHeight = 50 // 设置固定的Header高度 tableView.estimatedSectionHeaderHeight = 50 // 设置估计的高度 } ``` #### 自定义 SectionHeaderView 接下来,在 `UITableViewDelegate` 的 `tableView(_:viewForHeaderInSection:)` 方法中返回自定义的 `UIView`,这可以是一个简单的 `UILabel` 或者更复杂的视图结构。 ```swift func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = UIView() headerView.backgroundColor = .systemBlue let label = UILabel() label.frame = CGRect(x: 15, y: 5, width: tableView.bounds.size.width - 30, height: 40) label.text = "Section $section + 1)" label.textColor = .white label.font = UIFont.boldSystemFont(ofSize: 16) headerView.addSubview(label) return headerView } ``` #### 悬停效果的实现原理 `UITableView` 默认情况下会在滚动时让 `SectionHeaderView` 随内容一起滚动。要实现悬停效果,可以通过设置 `UITableView` 的 `style` 为 `.grouped` 或者通过自定义 `UITableView` 子类并重写相关方法来调整 `SectionHeaderView` 的行为。然而,在大多数情况下,`UITableView` 的默认行为已经能够满足悬停效果的需求,尤其是在使用 `.grouped` 样式时。 ```swift let tableView = UITableView(frame: .zero, style: .grouped) ``` 使用 `.grouped` 样式的 `UITableView` 会自动处理 `SectionHeaderView` 的悬停效果,无需额外的代码。 #### 优化和注意事项 - **性能优化**:当 `SectionHeaderView` 包含复杂的视图结构时,应确保其布局和渲染尽可能高效,以避免影响滚动性能。 - **动态高度**:如果 `SectionHeaderView` 的高度是动态变化的,应适当调整 `sectionHeaderHeight` 和 `estimatedSectionHeaderHeight`。 - **颜色和动画**:为了提升用户体验,可以在 `SectionHeaderView` 上添加渐变色、阴影效果或简单的动画。 #### 示例代码 以下是一个完整的示例,展示了如何设置 `UITableView` 并实现 `SectionHeaderView` 的悬停效果: ```swift import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self tableView.sectionHeaderHeight = 50 tableView.estimatedSectionHeaderHeight = 50 tableView.style = .grouped } // MARK: - UITableViewDataSource func numberOfSections(in tableView: UITableView) -> Int { return 5 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = "Row $indexPath.row)" return cell } // MARK: - UITableViewDelegate func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerView = UIView() headerView.backgroundColor = .systemBlue let label = UILabel() label.frame = CGRect(x: 15, y: 5, width: tableView.bounds.size.width - 30, height: 40) label.text = "Section $section + 1)" label.textColor = .white label.font = UIFont.boldSystemFont(ofSize: 16) headerView.addSubview(label) return headerView } } ``` 通过上述方法,可以有效地实现 `UITableView` 的 `SectionHeaderView` 悬停效果,从而提升应用的用户体验和界面美观度[^1]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值