当方向改变时,UILabel内部的UITableViewCell不会调整大小

时间:2014-06-17 12:05:19

标签: ios objective-c uitableview

我正在使用包含两个UILabel的单元格填充我的UITableView:其中一个是标题,另一个是内容。我正在计算他们在heightForRowAtIndexPath中的大小:在我改变方向之前,一切看起来都很酷。当我更改方向时,每个标签的大小似乎没有变化。例如,如果我从纵向更改为横向,则预期的行为是看到标签具有较小的高度(假设它是多行标签)。然而,标签的高度保持不变,我得到一个丑陋,迷失方向的观点。我为此编写的代码如下:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat tableWidth = [tableView bounds].size.width;

    ListItem* glossaryItem;
    if ([tableView isEqual:self.searchDisplayController.searchResultsTableView])
    {
        glossaryItem =(ListItem*)[self.searchResults objectAtIndex:indexPath.row];
    }
    else
    {
        glossaryItem =(ListItem*)[self.glossary objectAtIndex:indexPath.row];
    }
    NSString* name = [NSString stringWithFormat:@"<p><b>%@</b> :</p>", glossaryItem.name];

    NSString* content = glossaryItem.details[0];
    NSAttributedString* nameWithStyle = [HTMLParser parseText:name withFontSize:16 withFontType:@"Light"];

    NSAttributedString* contentWithStyle = [HTMLParser parseText:content withFontSize:16 withFontType:@"Light"];

    CGRect nameRect = [nameWithStyle boundingRectWithSize:CGSizeMake(screenWidth - 40, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:NULL];

    CGRect contentRect = [contentWithStyle boundingRectWithSize:CGSizeMake(screenWidth - 40, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:NULL];

    return nameRect.size.height + contentRect.size.height + 33;
}

HTMLParser是我编写的一个类,用于将HTML格式的文本解析为属性字符串。我猜这里的问题是方向改变后标签的尺寸没有重新计算。如果我添加以下代码,一切看起来都很好,但这对于包含大量单元格的表来说需要花费太多时间。

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    [self.tableView reloadData];
}

我该如何解决这个问题?如果需要,我可以提供标签的约束。

1 个答案:

答案 0 :(得分:0)

设置autoLayout约束 或者,继续按照你在didRotate上的方式调用reloadData ... 但请在cellForRow中标注大小......如下所示

仅在heightForRowAtIndexPath

中设置行的高度
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//Some identifier and recycling stuff

if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
    //Make labels smaller
}
else {
    //Make them longer
}

// save the calculated height for the label 

//并在heightForRowAtIndexPath中相应调整tableviewrow高度 }