如何在单击TableViewCell中的button时增加标签和单元格大小。

我想单击一个SeeMoreBtn单元格后,扩大单元格的大小。

标签和单元格具有不同的长度,但是它们是标签大小的限制。

当状态过大时,我添加了一个seeMoreBtn,点击后会看到更多的剩余文字会显示在下面,那么如何增加标签和单元格大小。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { NSString *text = [items objectAtIndex:[indexPath row]]; CGSize constraint = CGSizeMake(300.0f, 150.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:constraint lineBreakMode:NSLineBreakByCharWrapping]; CGFloat height1 = MAX(size.height, 44.0f); return height1 + (40.0f); } - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *CellIdentifier = [NSString stringWithFormat:@"Cell-%d",indexPath.row]; cell=[tv dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } int lbltag = 1000; label=[[UILabel alloc]initWithFrame:CGRectZero]; [label setLineBreakMode:NSLineBreakByWordWrapping]; [label setMinimumScaleFactor:14.0f]; [label setNumberOfLines:0]; [label setFont:[UIFont systemFontOfSize:14.0f]]; NSString *text = [items objectAtIndex:[indexPath row]]; [label setText:text]; label.tag = lbltag; [cell addSubview:label]; CGSize constraint1=CGSizeMake(300.0f, 150.0f); CGSize size1=[text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:constraint1 lineBreakMode:NSLineBreakByWordWrapping]; [label setFrame:CGRectMake(10.0f, 10.0f, 300.0f, MAX(size1.height, 44.0f))]; int countText=text.length; if (countText>=350) { seeMoreBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; [seeMoreBtn setTitle:@"See More" forState:UIControlStateNormal]; seeMoreBtn.frame=CGRectMake(220.0f, MAX(size1.height, 44.0f)-10, 80.0f, 20.0f); seeMoreBtn.tag=indexPath.row ; [seeMoreBtn addTarget:self action:@selector(increaseSize:) forControlEvents:UIControlEventTouchUpInside]; [cell addSubview:seeMoreBtn]; } return cell; } -(void)increaseSize:(UIButton *)sender{ //What to write here that can adjust the label and cell size } 

如果你调用UITableViewCell的子类并使用layoutSubviews来调整单元的大小,那将会更好。

 //In SMTableViewCell.h @interface SMTableViewCell : UITableViewCell @property (weak, nonatomic) IBOutlet UILabel *statusLabel; @property (weak, nonatomic) IBOutlet UIButton *seeMoreButton; //SMTableViewCell.m - (void)layoutSubviews { CGRect labelFrame = self.statusLabel.frame; labelFrame.size.height = self.frame.size.height - 55.0f; self.statusLabel.frame = labelFrame; CGRect buttonFrame = self.seeMoreButton.frame; buttonFrame.origin.y = labelFrame.origin.y+labelFrame.size.height+10.0f; self.seeMoreButton.frame = buttonFrame; } 

保留一个数组来存储selectedIndexPaths:

 @property (nonatomic, strong) NSMutableArray *selectedIndexPaths; 

计算单元的高度:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath]; CGFloat maxHeight = MAXFLOAT; CGFloat minHeight = 40.0f; CGFloat constrainHeight = isSelected?maxHeight:minHeight; CGFloat constrainWidth = tableView.frame.size.width - 20.0f; NSString *text = self.items[indexPath.row]; CGSize constrainSize = CGSizeMake(constrainWidth, constrainHeight); CGSize labelSize = [text sizeWithFont:[UIFont systemFontOfSize:15.0f] constrainedToSize:constrainSize lineBreakMode:NSLineBreakByCharWrapping]; return MAX(labelSize.height+75, 100.0f); } 

初始化自定义显示更多TableViewCell:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"CellIdentifier"; SMTableViewCell *cell= (SMTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([SMTableViewCell class]) owner:nil options:nil] lastObject]; } BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath]; cell.statusLabel.numberOfLines = isSelected?0:2; NSString *text = self.items[indexPath.row]; cell.statusLabel.text = text; NSString *buttonTitle = isSelected?@"See Less":@"See More"; [cell.seeMoreButton setTitle:buttonTitle forState:UIControlStateNormal]; [cell.seeMoreButton addTarget:self action:@selector(seeMoreButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; [cell.seeMoreButton setTag:indexPath.row]; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } 

button点击事件方法:

 - (void)seeMoreButtonPressed:(UIButton *)button { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0]; [self addOrRemoveSelectedIndexPath:indexPath]; } - (void)addOrRemoveSelectedIndexPath:(NSIndexPath *)indexPath { if (!self.selectedIndexPaths) { self.selectedIndexPaths = [NSMutableArray new]; } BOOL containsIndexPath = [self.selectedIndexPaths containsObject:indexPath]; if (containsIndexPath) { [self.selectedIndexPaths removeObject:indexPath]; }else{ [self.selectedIndexPaths addObject:indexPath]; } [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } 

如果选中单元格,则会显示相同的事件:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; [self addOrRemoveSelectedIndexPath:indexPath]; } 

示例演示项目链接。

添加如下属性:

 @property(strong, nonatomic) NSArray *enlargedIndexPaths; 

将其初始化为一个空数组。 实现表视图委托:

 - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return ([self.enlargedIndexPaths containsObject:indexPath])? 88.0 : 44.0; } 

然后在增加大小:

 UITableViewCell *cell = sender.superview; NSIndexPath *indexPath = [self.tableView indexPathFoCell:cell]; [self.enlargedIndexPaths addObject:indexPath]; // do you want to enlarge more than one at a time? You can remove index paths // here, too. Just reload them below [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:self.enlargedIndexPaths] withRowAnimation:UITableViewRowAnimationTop]; [self.tableView endUpdates]; 

那么,这个想法是根据你为单元格设置的值来改变单元格的高度。 你可以有一个NSArray,在这里你可以标记所有单元格的值:isExpanded(true或false)。

回顾一下,创build一个NSMutableArray来存储单元格状态(扩展与否):

 NSMutableArray *cellState; 

初始化数组,并用零填充所有的UITableView项目数组。 当单元格展开时,将cellState objectAtIndex值从0设置为1(将其标记为展开)。

然后重新加载该单元格:

 [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationFade]; 

并修改- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 函数返回一个更大的值,如果单元格展开…

而已!