0

行の高さをコンテンツの高さに基づくようにしたいので、各行の高さはコンテンツに基づいて収まるようにサイズ設定されます。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return tableView.contentSize.height;
}

これは私がこれまで持っているものですが、うまくいきません。

4

3 に答える 3

1

基本的に、セルのコンテンツを取得し、それに基づいてセルのサイズを決定する必要があります。たとえば、

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    NSString *string = cell.textLabel.text;
    CGSize textSize = [string sizeWithFont:[UIFont fontWithName:@"Helvetica" size:15] constrainedToSize:CGSizeMake(240, 5000)];
    return textSize.height + 40;
}    

上記が行うことは、セル内のテキストを取得し、必要な高さを計算し (幅が 240px で Helvetica 15pt を使用する場合)、それに応じてセルの高さを変更することです。メソッドのフレームを調整する必要がありcell.textLabelますcellForRowAtIndexPath

于 2012-07-30T22:27:50.183 に答える
1
Try this code for exmaple and also refer this http://www.icodeblog.com/2010/11/18/making-smarter-table-view-cells/  

 #define FONT_SIZE 14.0f
    #define CELL_CONTENT_WIDTH 125.0f
    #define CELL_CONTENT_MARGIN 10.0f
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
       // static NSString *CellIdentifier = @"Cell";
        NSString *CellIdentifier = [NSString stringWithFormat:@"%d", indexPath.row] ;
        UILabel *lblTitle = nil;
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;




            lblTitle =[[UILabel alloc]initWithFrame:CGRectMake(5, 15, 110, 44)];
            lblTitle.backgroundColor = [UIColor clearColor];
            lblTitle.textColor = [UIColor whiteColor];
            lblTitle.font = [UIFont systemFontOfSize:11.0];
            lblTitle.tag = 1;
            lblTitle.numberOfLines = 0;


            UILabel *lblType =[[UILabel alloc]initWithFrame:CGRectMake(125, 0, 75, 44)];
            lblType.backgroundColor = [UIColor clearColor];
            lblType.textColor = [UIColor whiteColor];
            lblType.font = [UIFont systemFontOfSize:11.0];
            lblType.tag = 2;

            UILabel *lblDate =[[UILabel alloc]initWithFrame:CGRectMake(200, 0, 60, 44)];
            lblDate.backgroundColor = [UIColor clearColor];
            lblDate.textColor = [UIColor whiteColor];
            lblDate.font = [UIFont systemFontOfSize:11.0];
            lblDate.tag = 3;

            UILabel *lblTime =[[UILabel alloc]initWithFrame:CGRectMake(265, 0, 50, 44)];
            lblTime.backgroundColor = [UIColor clearColor];
            lblTime.textColor = [UIColor whiteColor];
            lblTime.font = [UIFont systemFontOfSize:11.0];
            lblTime.tag = 4;

            [tableView beginUpdates];
            [tableView endUpdates]; 
            [cell.contentView addSubview:lblTitle];
            [cell.contentView addSubview:lblType];
            [cell.contentView addSubview:lblDate];
            [cell.contentView addSubview:lblTime];

        }

    //    lblTitle = (UILabel *) [cell.contentView viewWithTag:1];
    //    lblTitle.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"];
    //    NSString *strTitle =[NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];


    //    lblTitle.text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];

        NSString *text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];


        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];

        if (!lblTitle)
            lblTitle = (UILabel*)[cell viewWithTag:1];

        [lblTitle setText:text];
        [lblTitle setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];


        UILabel *lblType = (UILabel *) [cell.contentView viewWithTag:2];
        lblType.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"type"];

        UILabel *lblDate = (UILabel *) [cell.contentView viewWithTag:3];
        lblDate.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"date"];

        UILabel *lblTime = (UILabel *) [cell.contentView viewWithTag:4];
        lblTime.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"time"];

        return cell;
    }
    -(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];

        CGFloat height = MAX(size.height, 44.0f);

        return height + (CELL_CONTENT_MARGIN * 2);
    }
于 2012-07-31T06:02:41.737 に答える
0

はい、このメソッドが呼び出されたとき、セルのコンテンツ ビューのフレームは CGRectZero です。カスタム プロパティをセルに割り当てて、それを返すことをお勧めします。

于 2012-07-30T22:00:09.430 に答える