我有UITableView
UITableViewCell subclass
,此单元格子类包含UILabel
。文本将从互联网加载。
我想根据文字重新调整此UIlabel
。
我的cell subclass UILabel
只会知道文字从互联网到达时的大小,这意味着我需要在单元格绘制时调整UILabel
的大小:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// resizing label here
cell.mylabel ...
}
答案 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
属性,该属性在计算完成后存储高度,并在每次需要时重新使用。