快速滚动时,自定义单元格中的多行标签与下一个单元格重叠

我发现类似的问题几乎被问了几十次,但没有一个答案解决了我的问题(或者我太累了,所以我没有正确地回答问题)

我有一个自定义单元格的表格。

细胞看起来像这样

我的故事板中的自定义单元格

该单元格的typesResultsViewCell,它是从UITableViewCell派生。

单元格中的最后一个标签是多行单元格。 那个有时与下一个单元格的内容重叠。

这是我的cellForRowAtIndexPath函数

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"StandardSearchResultCell"; ResultsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; // Configure the cell... Data *theData = [Data getInstance]; Company *theCompany = [theData.results objectAtIndex:indexPath.row]; cell.lblTitle.text = theCompany.DisplayName; cell.lblDescription.text = theCompany.Description; cell.lblAddressPt1.text = theCompany.AddressPt1; cell.lblAddressPt2.text = theCompany.AddressPt2; cell.lblPhone.text = theCompany.Phone; cell.lblEmail.text = theCompany.Email; cell.lblDescription.adjustsFontSizeToFitWidth = false; cell.lblDescription.lineBreakMode = UILineBreakModeWordWrap; cell.lblDescription.numberOfLines = 0; [cell.lblDescription sizeToFit]; /////////////////////////////////////////// //edit -Added after David H's answer, but it didn't solve the problem cell.contentView.clipsToBounds = false; UIFont *cellFont = [UIFont systemFontOfSize:12.0]; CGSize constraintSize = CGSizeMake(270.0f, MAXFLOAT); CGSize labelSize = [theCompany.Description sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; [cell.contentView setFrame:CGRectMake(cell.contentView.frame.origin.x, cell.contentView.frame.origin.y, 270, 90 + labelSize.height)]; //end of edit /////////////////////////////////////// return cell; } - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { Data *theData = [Data getInstance]; Company *theCompany = [theData.results objectAtIndex:indexPath.row]; UIFont *cellFont = [UIFont systemFontOfSize:12.0]; CGSize constraintSize = CGSizeMake(270.0f, MAXFLOAT); CGSize labelSize = [theCompany.Description sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; return (90.0f + labelSize.height); } 

我究竟做错了什么?

这可能会让你感到惊讶,但UIView属性“clipsToBounds”的默认值是NO – 也就是说,如果子视图延伸超过视图的框架,则仍然显示它们。

解决的办法是确保这些视图都没有将“clipsToBounds”设置为NO。 您应该将它设置在cell.contentView为YES,并确保cell.contentView的框架具有相同的高度,您在委托的'heightForRowAtIndexPath:'方法报告。

您可能还需要在多行标签上将“clipsToBounds”设置为YES(不确定,可能不是)。

您将需要根据该标签的文本高度来调整您的tableViewCell高度。 例如采取这种方法:

 - (int)textHeight:(NSString *)text { int width = self.tableView.frame.size.width; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 30)]; label.numberOfLines = kMyNumberOfLines; //setup the label to look like the label of the cell label.text = text; [label sizeToFit]; int h = (int)label.frame.size.height; [label release]; return h; } 

然后在你的heightForRowAtIndexPath使用该方法来确定你的单元格的高度。

按照这样…

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *myCell=[tableView dequeueReusableCellWithIdentifier:@"hi"]; myCell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"hi"]; if (myCell==nil) { NSArray *viewsToRemove = [mytable1 subviews]; for (UITableView *table in viewsToRemove) { [table removeFromSuperview]; } } return myCell; }