7

我的内部有一个原型单元格,UITableView其中包含一个UILabel. 我想根据标签中文本的大小动态更改标签(和单元格)的大小。

我这样创建原型单元cellForRowAtIndexPath

static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
return cell;

然后我ProgramDetailCell有以下实现:

@implementation ProgramDetailCell
- (void)layoutSubviews {
    [super layoutSubviews];
    [self.descriptionLabel sizeToFit];
}
@end

第一次显示单元格时,layoutSubviews会调用它,但descriptionLabel不会调整其大小。但是,如果我向下滚动表格并再次备份,则会出现“重用”单元格,并且标签的大小已正确调整!

为什么第一次显示单元格时它不起作用 - 我需要做些什么来修复它。

提前致谢!

4

9 回答 9

9

在 xib 中,转到第一个选项卡,在 Interface Builder Document 下,取消选中使用自动布局框。

于 2014-04-01T10:08:50.910 回答
4

它不起作用,因为您正在使用auto layout. 你需要一些auto layout方法来实现这一点。

这是解决方案。

步骤1 :

UILabel固定到 的顶部和底部UITableViewCell。您可以通过Interface Builderon Vertical ConstraintfromUILabeltopofbottom来实现这一点。如果单元格的高度增加,这将使UILabel高度增加,反之亦然。

第2步:

在你的 UIViewController- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 方法中计算UITableViewCell.

您可以使用以下方法计算它:

 CGRect textFrame = [YourText boundingRectWithSize:CGSizeMake(width of the label, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:Your Font} context:nil];

现在返回textFrame.size.height+ 填充(如果存在)。

第 3 步:

您将实现您想要的 --- “根据标签中文本的大小动态更改标签(和单元格)的大小”,即使是第一次编译和运行。

于 2015-12-02T09:15:56.883 回答
2

从服务器检索所有数据后,您可以UILabel使用此方法获取该数据的高度。

CGSize maximumSize = CGSizeMake(210, 9999);
for (int i = 0; i < [_arrProductList count]; i++) {

      float row_height = 0.0f;

      ProductInformation *product_obj = [_arrProductList objectAtIndex:i];
      CGSize desc_size = [self measureHeightForText:product_obj.product_desc forFont:   [UIFont systemFontOfSize:14] forSize:maximumSize];

      row_height = row_height + desc_size.height;

   //   [_arrRowHeights addObject:[NSString stringWithFormat:@"%f", row_height]]; You can take it into array.

}

[tableView reloadData];

在这里我已经给出了描述measureHeightForText:。这个逻辑适用于所有iOS5, iOS6, iOS7

-(CGSize)measureHeightForText:(NSString *)strText forFont:(UIFont *)font forSize:(CGSize)size{

    if (!testingLabel) {

        testingLabel = [[UILabel alloc] init];
        // testingLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
        testingLabel.text = @"";
        testingLabel.numberOfLines = 0;

    }

    testingLabel.text =strText;
    testingLabel.font = font;
    CGSize expectedSize = [testingLabel sizeThatFits:size];
    return expectedSize;
}

然后根据它更新标签的大小。这对我来说很好。我正在使用它。

于 2014-01-08T13:20:01.040 回答
1

因为何时layoutSubviews调用你descriptionLabel的文本尚未设置。当你滚动时,文本被设置。所以现在是正确的。

我建议您sizeToFit在设置文本后致电。

static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
[cell.descriptionLabel sizeToFit];
return cell;
于 2014-01-08T12:55:00.237 回答
1

调用它heightForRowAtIndexPath并手动计算高度

static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
[cell.descriptionLabel sizeToFit];

return cell.descriptionLabel.frame.size.height+cell.descriptionLabel.frame.origin.y;
于 2014-01-08T12:55:06.240 回答
1

您可以使用以下代码:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;
于 2014-01-08T13:07:55.993 回答
1

如果您的要求是动态更改标签高度,请点击以下链接。当我们需要改变标签的高度时,我们还需要改变行高:

调整 UILabel 的大小不太有效

于 2014-01-08T13:20:30.217 回答
0

使用以下代码在单元格中设置动态高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *messagetext=[NSString stringWithFormat:@"%@",[[arryStoryView objectAtIndex:indexPath.row] valueForKey:@"messagetext"]];

    CGSize StoryTextSize= [messagetext sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0f] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];

    int TotalHeight;
    TotalHeight= StoryTextSize.height + 10; 

    return TotalHeight;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell1";
    UITableViewCell *cell=[tblSendMsg dequeueReusableCellWithIdentifier:CellIdentifier];

    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                 reuseIdentifier:CellIdentifier];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSString *storytext=[NSString stringWithFormat:@"%@",[[arryStoryView objectAtIndex:indexPath.row] valueForKey:@"storytext"]];

    CGSize StoryTextSize = [storytext sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0f] constrainedToSize:CGSizeMake(300, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
    lblStoryText.frame=CGRectMake(5, 25, [[UIScreen mainScreen] bounds].size.width-10, StoryTextSize.height+30);

    int nooflines=StoryTextSize.height/16;
    int i= StoryTextSize.height;
    if(i%16 !=0)
    {
        nooflines=nooflines+1;
    }

    lblStoryText.numberOfLines=nooflines;
    lblStoryText.font=[UIFont fontWithName:@"Georgia" size:17.0f];
    lblStoryText.text=[NSString stringWithFormat:@"%@",storytext];

    return cell;
}
于 2014-01-08T13:21:38.143 回答
0

如果您使用自动布局,则修改框架将无效。

相反,您应该修改约束。

于 2016-04-23T12:00:22.913 回答