UILabel SizeToFit的UITableView在滚动时会变得混乱

时间:2013-06-05 20:46:54

标签: ios objective-c uitableview uilabel sizetofit

大家好我的tableview有问题,我用uilabel SizeToFit制作单元格,然后计算UILabel高度设置单元格高度一切正常除外当我滚动我的tableView文本变得奇怪,就像每行一个字符:

我的TableViewVell方法是:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}


UILabel *label = (UILabel *)[cell viewWithTag:1];
label.text = [someArray objectAtIndex:indexPath.row];
// Set the UILabel to fit my text;
messageLabel.lineBreakMode = UILineBreakModeWordWrap;
messageLabel.numberOfLines = 0;
[messageLabel sizeToFit];


return cell;   
}

单元格高度保持正确大小问题只有UILabel ... 这是加载视图时的结果:

First screenshot

这是在我开始滚动TableView之后:

Second screenshot

任何帮助???

5 个答案:

答案 0 :(得分:20)

方法sizeToFit尊重框架的宽度并调整height。并且表视图单元重用单元。将这两种行为结合起来可能会导致您所描述的问题。

您的标签内容非常短(例如,在第4个单元格中标有“jio”的单元格),其大小调整为sizeToFit,并且生成的宽度小于您想要的原始宽度。

之后,表视图重用该单元格,而sizeToFit仍然尊重先前调用sizeToFit计算的小宽度。

解决方案:

1)每次拨打sizeToFit之前,请将框架的宽度设置为原始的标签宽度:

CGRect frame = messageLabel.frame;
frame.size.width = 100.0; //you need to adjust this value 
messageLabel.frame = frame;

2)使用行高计算并设置帧高。无需使用sizeToFit

答案 1 :(得分:1)

您应该将您的单元格子类化并清理

上的UILabel
 override func prepareForReuse() {
    super.prepareForReuse()
    self.label.text = nil
}

答案 2 :(得分:0)

答案 3 :(得分:0)

如果您没有使用自动布局,也可以通过在UIView上添加类别来解决此问题

public func sizeToFit(constrainedSize: CGSize) -> CGSize {
  var newSize = sizeThatFits(constrainedSize)
  newSize.width = min(newSize.width, constrainedSize.width)
  newSize.height = min(newSize.height, constrainedSize.height)
  self.size = newSize
  return newSize
}

我们的想法是使用具有约束大小的sizeThatFits来确定要采用的大小,然后使用最小预期宽度/高度。

然后你只需做类似

的事情
yourLabel.sizeToFit(self.contentView.size) // or
yourLabel.sizeToFit(CGSize(width: maxWidth, height: self.contentView.size.height))

答案 4 :(得分:0)

您可以设置label的首选Width属性。这对我有用

preferred Width