我想在单元格上单击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,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); }
- (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; }
按钮点击事件方法:
- (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]; }