如何使节标题中的 UITextView 将其高度调整为其内容

Posted

技术标签:

【中文标题】如何使节标题中的 UITextView 将其高度调整为其内容【英文标题】:How to make UITextView in section header adjust its height to its content 【发布时间】:2014-02-13 22:31:56 【问题描述】:

我无法让它工作。我在当前视图控制器上使用自动布局。我有一个具有节标题的 UITableView ,每个节标题都有 UITextView ,其文本的长度因节而异。我不能让它自动放大它的高度以适应内容,所以不需要滚动(它的内容是属性文本)

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

    //UITextView *tv = [[UITextView alloc] init];
    //tv.editable = NO;        
    //tv.attributedText =  [self millionaireResults][section][@"header"];    
    //return tv;

    return [self millionaireResults][section][@"headerview"]; //this is a uitextview


// this did not workeither 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

    UITextView *tv = [self millionaireResults][section][@"headerview"];
    return tv.frame.size.height; 


如何解决这个问题?

我根据下面 Michael 的建议更新了代码

【问题讨论】:

【参考方案1】:

让你的“UITextView *tv”对象成为一个属性,然后你可以做这样的事情(假设你的表格视图只有一个部分):

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

    return (self.tv.frame.size.height);

如果您有更多部分(您确实有),您应该将该属性设置为 UITextView 对象的 NSArray。

这也意味着您需要设置“tv”对象的内容viewForHeaderInSection:”被调用之前。

【讨论】:

成功了!谢谢!你能告诉我为什么它有效吗?唯一的区别是,我没有在 viewForHeaderInSection: ... 方法中创建 UITextView 对象,而是按照您的建议将它们创建为 NSArray 属性。在该委托方法中创建有什么问题?如果您知道,我将不胜感激。 因为heightForHeaderInSection 早在viewForHeaderInSection 被调用之前就被调用了。在实际绘制单个单元格和部分标题之前,ios 需要知道表格及其内容的高度。 讨厌重新打开它,但上面的代码在我的代码(我的愚蠢)中不起作用(我有一个返回 200;),它通过返回该大小使其适合 UITextView。在上面的代码中返回 self.tv.frame.size.height 返回 0.000000 (请不要生气,但我必须取消选中接受的答案,直到我让它工作) 记得我告诉过你在调用“heightForHeaderInSection”之前实际填充文本视图条目数组,对吧? 如果您使用“UITextView *tv = [[UITextView alloc] init]];”创建 UITextView,则没有设置帧大小。在将其保存到数组中之前,您需要为其指定一个帧大小。【参考方案2】:

这是对我有用的答案

    在创建 UITextView 时,必须设置 scrollEnabled 为假。 您的 UITextView 必须指定覆盖水平空间的宽度,否则自动大小计算将关闭(有时它有时不是,我认为取决于 wordbreak 或其他东西,但它不一致!)并且只有在您旋转时才会自行修复强制重绘的设备 在heightForHeaderInSection方法中,你必须得到 sizeThatFits 并将其高度作为文本视图的高度返回

这里是高度计算(我在这个网站上找到了这个http://www.raywenderlich.com/50151/text-kit-tutorial)

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

    UITextView *tv1 = (UITextView *)[self millionaireResults][section][@"headerview"];
    // sizethatfits calculates the perfect size for this UITextView 
    // if you gave your UITextView full width
    CGSize goodsize = [tv1 sizeThatFits:tv1.frame.size];
    return goodsize.height+4; // here 4 is not necessary, i just put it as an offset

这是创建这些 UITextView 对象的代码

for (int i = 0; i < [milarr count]; i++)         
    UITextView *tv = [[UITextView alloc] init];
    tv.editable = NO;
    tv.attributedText = milarr[i];
    // labelTopTitle and this table in question have same width in an autoLayouted view
    // so i am giving width of labelTopTitle to let UITextView cover full available
    // horizontal space
    tv.frame = CGRectMake(0, 0, self.labelTopTitle.frame.size.width,FLT_MAX);
    //tv.backgroundColor = [UIColor grayColor];
    //tv.textContainerInset = UIEdgeInsetsZero;
    tv.scrollEnabled = NO;
    [results  addObject:@@"headerview": tv,
                         @"rows":@[...]
                         
     ];

【讨论】:

以上是关于如何使节标题中的 UITextView 将其高度调整为其内容的主要内容,如果未能解决你的问题,请参考以下文章

我将如何(以编程方式)将 UITextView 的高度设置为其在 Swift 中的内容大小?

动态 UIScrollView 中的动态 UITextView - iOS

具有动态高度的 UITextView

iOS Swift - 动态增加 UITextView 和父 UIView 的高度

添加文本和禁用滚动时如何使 UITextView 字段扩展?

UITableview swift中的UITextview高度