0

我看到类似的问题几乎被问了几十次,但没有一个答案解决了我的问题(或者我太累了,所以我没有正确地遵循答案)

我有一个带有自定义单元格的表格视图。

细胞看起来像这样

我在故事板中的自定义单元格

该单元格是从 UITableViewCell 派生的 ResultsViewCell 类型。

单元格中的最后一个标签是多行单元格。那个有时会与下一个单元格的内容重叠。

这是我的 cellForRowAtIndexPath 函数

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"StandardSearchResultCell";

        ResultsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        // Configure the cell...
        Data *theData = [Data getInstance];
        Company *theCompany = [theData.results objectAtIndex:indexPath.row];

        cell.lblTitle.text = theCompany.DisplayName;

        cell.lblDescription.text = theCompany.Description;
        cell.lblAddressPt1.text = theCompany.AddressPt1;
        cell.lblAddressPt2.text = theCompany.AddressPt2;
        cell.lblPhone.text = theCompany.Phone;
        cell.lblEmail.text = theCompany.Email;

        cell.lblDescription.adjustsFontSizeToFitWidth = false;
        cell.lblDescription.lineBreakMode = UILineBreakModeWordWrap;
        cell.lblDescription.numberOfLines = 0;
        [cell.lblDescription sizeToFit];

       ///////////////////////////////////////////
       //edit -Added after David H's answer, but it didn't solve the problem
       cell.contentView.clipsToBounds = false;
       UIFont *cellFont = [UIFont systemFontOfSize:12.0];
       CGSize constraintSize = CGSizeMake(270.0f, MAXFLOAT);
       CGSize labelSize = [theCompany.Description sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
       [cell.contentView setFrame:CGRectMake(cell.contentView.frame.origin.x, cell.contentView.frame.origin.y, 270, 90 + labelSize.height)];
       //end of edit
       ///////////////////////////////////////

        return cell;
    }


- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    Data *theData = [Data getInstance];
    Company *theCompany = [theData.results objectAtIndex:indexPath.row];

    UIFont *cellFont = [UIFont systemFontOfSize:12.0];
    CGSize constraintSize = CGSizeMake(270.0f, MAXFLOAT);
    CGSize labelSize = [theCompany.Description sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return (90.0f + labelSize.height);
}

我究竟做错了什么?

4

3 回答 3

1

这可能会让您感到惊讶,但 UIView 属性 'clipsToBounds' 的默认值为 NO - 也就是说,如果子视图超出视图的框架,则无论如何都要显示它们。

解决方法是确保这些视图中没有一个将“clipsToBounds”设置为 NO。您应该在 cell.contentView 上将其设置为 YES,并确保 cell.contentView 的框架与您在委托 'heightForRowAtIndexPath:' 方法中报告的高度相同。

您可能还需要在多行标签上将“clipsToBounds”设置为“是”(不确定,可能不是)。

于 2012-09-11T23:47:56.907 回答
0

您将需要tableViewCell根据该标签的文本高度调整高度。例如采取这种方法:

- (int)textHeight:(NSString *)text {
    int width = self.tableView.frame.size.width;
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 30)];
    label.numberOfLines = kMyNumberOfLines;

    //setup the label to look like the label of the cell

    label.text = text;
    [label sizeToFit];

    int h = (int)label.frame.size.height;
    [label release];
    return h;
}

然后在您的方法中使用该方法heightForRowAtIndexPath来确定单元格的高度。

于 2012-09-12T00:53:20.527 回答
0

像这样跟...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *myCell=[tableView dequeueReusableCellWithIdentifier:@"hi"];
    myCell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"hi"];

    if (myCell==nil)
    {
        NSArray *viewsToRemove = [mytable1 subviews];

        for (UITableView *table in viewsToRemove) 
        {
            [table removeFromSuperview];
        }
    }    
    return myCell;
}
于 2012-09-12T04:57:01.517 回答