如何修改 heightForRowAtIndexPath 使其调整到其中的 textview 的高度,同时在 textview 为空时保持最小高度?

Posted

技术标签:

【中文标题】如何修改 heightForRowAtIndexPath 使其调整到其中的 textview 的高度,同时在 textview 为空时保持最小高度?【英文标题】:How can I modify the heightForRowAtIndexPath so that it adjust height to the textview in it,but also keep the minimum height when textview is empty? 【发布时间】:2016-10-16 14:49:11 【问题描述】:

我有一个 tableView,里面有静态单元格。一个单元格包含地图、UITextView 和其他控件:

此文本视图具有以下约束:

到目前为止,我将heightForRowAtIndexPath 设置为该单元格的静态值:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

    if indexPath.row == 0 
        return 311;
    

但是当文本更长时,文本视图 - 而不是增长 - 包含里面的文本并且用户必须滚动它。 基本上它的高度总是311。我想改一下,让整个单元格适应textView的内容。

我尝试将return 311 更改为return UITableViewAutomaticDimension,但是当没有文本时,单元格会缩小并且右侧的控件不可见。

所以我的问题是 - 如何根据里面的文本设置单元格的动态高度,同时保持 311 的最小高度?

【问题讨论】:

【参考方案1】:

如果您只是显示文本而不以任何方式对其进行编辑。您应该尝试使用 UILabel,如果正确添加了约束,UITableViewAutomaticDeminsions 将按预期工作。

你可以做的是给 textView 添加一个高度约束,然后根据你获得的字符串的大小来增加它的大小。当然你也需要调用 layoutIfNeeded ! UITableViewAutomaticDimensions 应该负责其余的工作。

【讨论】:

您不需要手动更改约束的高度。标签自动具有较低优先级(默认情况下)的固有大小约束,将其设置为显示所有文本所需的***别。 我的意思是如果他想使用textView!在这种情况下,他将不得不改变约束的高度。 UILabel 会自行调整大小。 各位感谢您的所有意见,我在尝试使用 TextView 时遇到了很多困难,但后来我决定尝试 UILabel 并且令人惊讶的是 - 它奏效了。然后我还使用了来自***.com/questions/1054558/… 的提示,现在我的 UILabel 看起来像 UITextView 并且可以相应地扩展表格。【参考方案2】:

在文本视图中添加高度约束 >= 最小值(当单元格为 311 时会是什么,然后将单元格高度设置为自动。

【讨论】:

在我的情况下最小值是 95,我添加了Height >= 95 约束,但是当文本很大时 - 这个约束基本上保持在 95 并且里面的 textview 是可滚动的。对我来说奇怪的是,在cellForRowAtIndexPath 中我禁用了cell.textView.scrollEnabled = false 的滚动,但它仍然可以滚动 您只显示文本是真的吗?如果是这样,请更改为标签并使用高度约束。 这里的标签会支持多行吗? 是的,您可以将numberOfLines 属性(在界面生成器中称为Lines)设置为0,它将根据需要扩展到尽可能多的行。 您应该也可以使用文本视图来执行此操作。我刚刚编写了一个演示项目,其中包含未选中“启用滚动”的文本视图、>= 显式高度约束和自动调整单元格大小,并且可以正常工作。【参考方案3】:

我不完全理解你的问题,但根据你所说的也许这可行:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    if UITableViewAutomaticDimension > 311 
            return UITableViewAutomaticDimension
    
    else 
       return 311
   

我只是检查单元格是否应该大于最小值 311,然后返回最小值或更大的值

【讨论】:

我试过了,但没用...我在那里添加了print(UITableViewAutomaticDimension)' just before the if statement and I'm getting -1`,不知道为什么:| 这很奇怪,但在你的问题中你说它有效,至少在有文字的时候? 也许添加@Sahil 的答案也会有所帮助,正如他在问题下方解释的那样 hm @Eric,很抱歉没有很好地描述我的问题...我尝试只返回UITableViewAutomaticDimension,但是文本根本不可见,单元格在地图的末尾结束 在我的问题中用textView.frame.height 两次替换UITableViewAutomaticDimension 是否有效?

以上是关于如何修改 heightForRowAtIndexPath 使其调整到其中的 textview 的高度,同时在 textview 为空时保持最小高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改系统表

如何修改微信链接内容

如何修改MFC窗口标题

Vbox如何修改虚拟机器的uuid?

myeclipse如何修改Web项目名称,eclipse如何修改项目名字

SQL SERVER 如何修改ID列?