在UITableViewCell子类中动态更改UILable大小的位置

时间:2014-09-06 14:01:06

标签: ios objective-c uitableview

我有UITableView UITableViewCell subclass,此单元格子类包含UILabel。文本将从互联网加载。

我想根据文字重新调整此UIlabel

我的cell subclass UILabel只会知道文字从互联网到达时的大小,这意味着我需要在单元格绘制时调整UILabel的大小:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
   // resizing label here 
   cell.mylabel ...
    }
  • 有没有其他方法可以采用相同或更有效的方法来做同样的事情?
  • 可以在单元格子类中完成大小调整吗?

4 个答案:

答案 0 :(得分:0)

更新单元格标签中的文本时,应在标签上调用sizeToFit以调整其大小:

[cell.myLabel sizeToFit];

不要直接设置框架。

就个人而言,我会在单元子类内的UILabel上执行sizeToFit,如下所示:

- (void)layoutSubviews
{
    [super layoutSubviews];
    [self.myLabel sizeToFit];
}

然后当更新单元格上的文本时(这应该发生在cellForRowAtIndexPath中),调用[cell setNeedsLayout]将强制layoutSubviews方法在单元格上触发。

这种方法可以很好地分离关注点,并使Cocoa框架按照它的方式为您服务。

如果您希望UILabel垂直调整以及水平调整,则需要将numberOfLines属性设置为0,如下所示:

self.myLabel.numberOfLines = 0;

答案 1 :(得分:0)

进行测试以查看重新加载表时调用哪些tableview委托方法。我想,当你等待网络返回你的标签细节时,tableview将至少已经加载了一次,所以你将在调用之后[UITableView reloadData];某处。在各种委托方法中放入一些日志语句,看看哪种方法是更新标签的最佳方法。

答案 2 :(得分:-1)

您可以使用该代码按文字计算标签的大小。但您必须首先指定标签宽度或高度。

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
NSDictionary *attributes = @{NSFontAttributeName:[UIFont fontWithName:@"AppleSDGothicNeo-Regular" size:18], NSParagraphStyleAttributeName:paragraphStyle.copy};

CGRect cellSize = [yourText boundingRectWithSize:CGSizeMake(yourLabelWidth,9999) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

答案 3 :(得分:-1)

你应该像user2239950所说的那样计算你的细胞高度。

您的单元格高度计算似乎相当密集,因此我认为计算它的最佳位置就是从互联网接收文本时。

除了存储文字的NSString旁边,您应该添加NSNumber属性,该属性在计算完成后存储高度,并在每次需要时重新使用。