title: 點(diǎn)擊cell動態(tài)改變cell高度date: 2016-06-16 12:08:29
tags:
- TableViewCell
- 動態(tài)改變高度
- cell伸縮
categories: iOS知識小結(jié)
應(yīng)一個群朋友的要求,想實現(xiàn)如下圖這種的效果:
問題:點(diǎn)擊cell玲躯,然后根據(jù)cell內(nèi)部出來的view的高度來動態(tài)改變當(dāng)前的點(diǎn)擊的cell的高度据德。
解決思路:
- 點(diǎn)擊cell的時候會彈出一個contentView,根據(jù)數(shù)據(jù),獲取這個contentView的高度跷车。為了實現(xiàn)刷新的動畫效果棘利,接下來的cell的高度變化都在
[tableView beginUpdates];
// code
[tableView endUpdates];
上面這個代碼塊之間執(zhí)行。
- 當(dāng)contentView以動畫的形式出現(xiàn)的時候朽缴,先展示contentView善玫,然后再改變cell的高度
- 當(dāng)contentView消失的時候,先將contentView消失密强,然后再刷新這一行的高度
- 在返回cell高度的方法中茅郎,根據(jù)contentView是否顯示而顯示不同的高度。
最后簡單的模擬了一下不同cell的高度框仔,實現(xiàn)的效果如下圖:現(xiàn)在cell高度計算或渤,都會先給一個預(yù)估高度系冗,這樣代理方法就不會一開始走
heightForRowAtIndexPath
這個方法,會先走cellForRowAtIndexPath
這個方法薪鹦,這樣的話掌敬,當(dāng)cell顯示的時候才去調(diào)用heightForRowAtIndexPath
方法,此時cell已經(jīng)創(chuàng)建成功了。這樣就可以在這個方法里通過cellForRowAtIndexPath
來獲取cell了,相比從前涝开,計算cell高度簡單多了循帐。
核心代碼:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
TestTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (!self.isVisiable) {
_index_arr = arc4random()%5;
_indexPath_cell = indexPath;
_self_adaption = YES;
CGFloat f = [[_Harray objectAtIndex:_index_arr] floatValue];
UIView *testView = [[UIView alloc]
initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, f - 10)];
testView.backgroundColor = [UIColor colorWithRed:1.000 green:0.971 blue:0.138 alpha:1.000];
testView.userInteractionEnabled = NO;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:testView.bounds];
imageView.image = [UIImage imageNamed:@"ab97283425c2ce1c75ccac15a1fed5fd.jpg"];
[testView addSubview:imageView];
_testView= testView;
[cell.contentView addSubview:testView];
[tableView beginUpdates];
testView.transform = CGAffineTransformMakeScale(1, 0.01);
[UIView animateWithDuration:0.5
animations:^{
testView.transform = CGAffineTransformMakeScale(1, 1);
CGRect oldFrame = cell.frame;
oldFrame.size.height = f;
cell.frame = oldFrame;
}completion:^(BOOL finish){
_visiable = YES;
}];
[tableView endUpdates];
}
else{
[UIView animateWithDuration:0.5
animations:^{
_testView.transform = CGAffineTransformMakeScale(1, 0.01);
}completion:^(BOOL finish){
[_testView removeFromSuperview];
_visiable = NO;
_self_adaption = NO;
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}];
}
}
demo地址:git傳送門