关于UITableView的一些小技巧
2015-10-14 本文已影响766人
南国青天
1.如何巧妙隐藏一行 UITableViewCell
有些时候, 我们想动态的隐藏某一行的UITableView里面某一行的Cell,一般我们会用到下面代码去实现第三行Cell隐藏.
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:
(NSIndexPath *)indexPath {
return indexPath.row == 3 ? 0 : 40;
}
但是很不幸的是, 我们有时候虽然把高度设置 0, 但是有时候Cell里面的Label的文字还是显示, 还和其他Cell重叠.
3C0DD058-3707-498B-A8DE-AAE44786918D.png
解决方法
有很多方法去解决这个问题, 只需要设置UITableViewDelegate里面添加下面代码, 或者在你的继承UITableViewCell的子类里面把这个属性设置YES.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.clipsToBounds = YES;
}
2.关于UITableView设置成Plain格式, 禁止SectionView悬浮
UITableView的Plain风格, 导致SectionTitle, SectionView悬浮在Navigation的下面, 不随这TableView滑动而滑动, 下面代码解决悬浮问题
- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat sectionHeaderHeight = 30;
BOOL isUpSectionScrollToNavigation = scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0;
BOOL isDownSectionScrollOutNavigation = scrollView.contentOffset.y >= sectionHeaderHeight;
if (isUpSectionScrollToNavigation) {
scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
}else if (isDownSectionScrollOutNavigation){
scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
}
}
3. 纯代码 UITableViewCell 应该哪里初始化视图
如果你使用的Cell是代码+Nib. 那么你在自定义的Cell的时候你可以在awakeFromNib
添加
//Custom UITableViewCell
- (void) awakeFromNib {
....
//在这里你可以用代码给Cell添加Label ImageView什么的. 该方法在Cell周期只会被执行一次
....
}
// UITableView
void viewDidLoad {
..
[self.tableView registerNib:[UINib nibWithNibName:@"DownloadCell" bundle:nil] forCellReuseIdentifier:cellID];
..
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
DownloadCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
return cell
}
但是如果你使用的是纯代码构建的UITableCell. 那么你就最好不要使用registerClass
方法. 因为UITableViewCell不会执行awakeFromNib
. 那么你在哪里添加你自定义的控件呢?
//Custom UITableViewCell
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]
if (self) {
//在这里你可以用代码给Cell添加Label ImageView什么的. 该方法在Cell周期只会被执行一次
}
return self
}
// UITableView
void viewDidLoad {
..
// [self.tableView registerNib:[UINib nibWithNibName:@"DownloadCell" bundle:nil] forCellReuseIdentifier:cellID];
..
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
DownloadCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[DownloadCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
return cell
}