iOS - 带有 UITextView 的表格视图单元格未正确调整大小

Posted

技术标签:

【中文标题】iOS - 带有 UITextView 的表格视图单元格未正确调整大小【英文标题】:iOS - Table View Cell with UITextView not resizing properly 【发布时间】:2013-02-03 09:50:09 【问题描述】:

我已经对一个单元类进行了子类化,并且正在使用 Storyboard 中的原型。有问题的单元格有一个嵌入的文本视图,它将显示不同长度的文本。 我已经在 heightForRowAtIndexPath: 中设置了单元格高度,但是尝试在 cellForRowAtIndexPath: 中调整 textview 本身的大小无法正常工作。 它不会在初始加载时调整大小,但一旦我将单元格滚动出视图然后再重新进入。但如果我继续来回滚动,它偶尔会再次缩小。

代码:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    int defaultSize = 0;
    int height = 0;
    if(indexPath.section%2==0)
        defaultSize = 160;
        NSMutableDictionary *currentPost = [newsFeedPosts objectAtIndex:indexPath.section];
        NSString *string = [currentPost valueForKey:@"detailsText"];
        CGSize stringSize = [string sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:NSLineBreakByWordWrapping];
        height = stringSize.height + defaultSize;
        NSLog(@"String Size Before: %f",stringSize.height);

    else
        defaultSize = 270;
        height = defaultSize;
    
    return height;

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

    static NSString *CellIdentifier;
    if(indexPath.section%2==0)
        CellIdentifier = @"NewsFeedText";
    else
        CellIdentifier = @"NewsFeedImage";
    
    NewsFeedCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // Configure the cell...
    [cell setBackgroundView:[[NewsFeedCellBackground alloc] init]];
    [cell.bottomContainer setClipsToBounds:YES];
    [cell.bottomContainer.layer setMasksToBounds:YES];
    [cell.imagePreview.imageView setContentMode:UIViewContentModeScaleAspectFit];
    [cell.bottomContainer setFrame:CGRectMake(0, cell.contentView.frame.size.height-30, cell.contentView.frame.size.width, 30)];

    //Data Object
    NSMutableDictionary *currentPost = [newsFeedPosts objectAtIndex:indexPath.section];
    //View
    cell.userImage.image = [UIImage imageNamed:[currentPost valueForKey:@"userImage"]];
    cell.userName.text = [currentPost valueForKey:@"userName"];
    cell.createdDate.text = [currentPost valueForKey:@"createdDate"];
    cell.patientName.text = [currentPost valueForKey:@"patientName"];
    cell.detailsText.text = [currentPost valueForKey:@"detailsText"];
    [cell.imagePreview setImage:[UIImage imageNamed:[currentPost valueForKey:@"imagePreview"]] forState:UIControlStateNormal];
    [cell.viewCase addTarget:self action:@selector(displayCase:) forControlEvents:UIControlEventTouchUpInside];

    //Image
    [cell.imagePreview addTarget:self action:@selector(displayImage:) forControlEvents:UIControlEventTouchUpInside];

    //Data
    cell.viewCase.tag = [[currentPost valueForKey:@"caseID"] intValue];

    //Cell Adjustments
    NSString *string = [currentPost valueForKey:@"detailsText"];
    CGSize stringSize = [string sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:NSLineBreakByWordWrapping];
    NSLog(@"String Size After: %f",stringSize.height);
    [cell.detailsText setFrame:CGRectMake(cell.detailsText.frame.origin.x, cell.detailsText.frame.origin.y, cell.detailsText.frame.size.width, stringSize.height+10)];
    [cell.detailsText setBackgroundColor:[UIColor redColor]];

    return cell;

【问题讨论】:

你在使用自动布局吗? 通过在情节提要中添加文本视图并为其提供正确的约束,这将更容易做到。它会随着单元格自动增长,因此您只需要计算单元格高度即可。 是的,我正在使用自动布局。不过使用它还是有点新意。什么是适当的约束?该单元格与 Facebook 新闻提要单元格基本相同(用户图像/名称在顶部,文本视图在中间,链接横幅视图在底部) 【参考方案1】:

原来使用自动布局允许我将顶部空间和底部空间设置为超级视图(单元格视图),并且由于单元格高度在 heightForRowAtIndexPath: 中更改,因此文本视图会自动调整大小.

【讨论】:

这只是帮助我解决了我的确切问题!非常感谢!

以上是关于iOS - 带有 UITextView 的表格视图单元格未正确调整大小的主要内容,如果未能解决你的问题,请参考以下文章

将 UITextView 放在 UITableView 页脚中

调整表格视图单元格以显示 UITextView 和 UIWebView

是否有类似IQKeyboardManagerSwift的工具在Swift iOS中将UITextView向上移动?

iOS - 带有表格视图和子视图的选项卡式应用程序

将 UITextView 作为第一响应者后,表格视图单元格不可选择

带有手势识别器的 UITextView - 有条件地向前触摸到父视图