更改后我的框架高度没有更新

Posted

技术标签:

【中文标题】更改后我的框架高度没有更新【英文标题】:My frame height is not updating after changes made 【发布时间】:2016-03-26 08:32:40 【问题描述】:

我在 UIView 中有一个 UITableView,我在它上面执行函数 insertRowsAtIndexPaths。出现更多内容,但 UITableView 高度保持不变。几天来,我已经阅读了数百篇 SO 帖子,似乎无法理解为什么不更新。

var tableView       = UITableView()
tableView.frame      = CGRectMake(0, 0, self.view.frame.width, view.frame.height)
tableView.estimatedRowHeight = 40
tableView.scrollEnabled = true
tableView.userInteractionEnabled  = true
tableView.rowHeight = UITableViewAutomaticDimension
tableView.delegate   = self
tableView.dataSource = self

然后如果我点击一个单元格..

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    let (parent, isParentCell, actualPosition) = self.findParent(indexPath.row)

    self.tableView.beginUpdates()
    self.updateCells(parent, index: indexPath.row)
    self.tableView.endUpdates()

    var frame : CGRect = self.tableView.frame
    print(frame.size) // Returns -> (375.0, 667.0)
    frame.size = self.tableView.contentSize
    print(frame.size) // Return -> (375.0, 1151.0)
    self.tableView.frame = frame


但 UITableView 的高度仍然为 667.0,如下所示:

.. 即使您现在可以清楚地看到 contentSize 超出了界限。

我可能会在这里遗漏什么?


更新

-- 这是我如何绘制cellForRowAtIndexPath ..

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    var cell : UITableViewCell!

    let (parent, isParentCell, actualPosition) = self.findParent(indexPath.row)

    if !isParentCell 
        cell = tableView.dequeueReusableCellWithIdentifier(childCellIdentifier, forIndexPath: indexPath)
        cell.textLabel!.text        = self.dataSource[parent].childs[indexPath.row - actualPosition - 1]
        cell.textLabel!.textColor   = UIColor(red: 35/255.0, green: 31/255.0, blue: 32/255.0, alpha: 1.0)
        cell.textLabel!.font        = UIFont(name: "STHeitiTC-Light", size: 16)
        cell.textLabel!.layer.borderColor = UIColor.purpleColor().CGColor
        cell.textLabel!.layer.borderWidth = 1.0
    
    else 
        cell = tableView.dequeueReusableCellWithIdentifier(parentCellIdentifier, forIndexPath: indexPath)
        cell.textLabel!.text        = self.dataSource[parent].title
        cell.textLabel!.textColor   = UIColor(red: 66/255.0, green: 116/255.0, blue: 185/255.0, alpha: 1.0)
        cell.textLabel!.font        = UIFont(name: "STHeitiTC-Light", size: 20)
    
    cell.textLabel!.frame = CGRectMake(0,0,self.view.frame.width, CGFloat.max)
    cell.selectionStyle                                       = .None
    cell.textLabel!.translatesAutoresizingMaskIntoConstraints = false
    cell.textLabel!.numberOfLines                             = 0
    cell.textLabel!.sizeToFit()
    cell.textLabel!


    return cell

问题的可视化..

【问题讨论】:

向tableview添加新行时contentSize会增加,tableview的frame会和tableview在content size增加后滚动 @Pyro 啊有趣。听起来好像有其他东西阻止了我的 tableView 可滚动。我还能在我的代码中向您展示您认为会阻止我向下滚动以查看新内容的其他内容吗? 【参考方案1】:

当你向tableview添加新行时contentSize会增加,tableview的frame会和tableview在content size增加后滚动

对于编程来说,它会像

tableView.userInteractionEnabled  = true
tableView.scrollEnabled = true

如果您应用了自动布局,否则您可以检查约束 - 它应该类似于顶部、底部、左侧、右侧的边距,或者您也可以指定高度/宽度而不是底部/右边距


更新::自动布局 看起来 Autolayout 是 UITableViewAutomaticDimension 的问题,根据苹果文档,一个教程和一个答案在 SO 这个 AutomaticDimension 仅在您启用自动布局时才有效,因此它可能无法计算正确的高度

Apple Doc:Self sizing

tableView.estimatedRowHeight = 85.0 tableView.rowHeight = UITableViewAutomaticDimension 一旦设置了这两个属性,系统就会使用 Auto Layout 来计算行的实际高度。

有关使用自动布局的自我调整大小的演示,您可以查看以下链接:

Self sizing cell demo:Appcoda

来自 Appcoda

但是,如果没有自动布局,自动调整大小的单元格将无法正常工作 依赖于约束来确定正确的行高。

可以通过 Interface Builder 和编程方式完成自动布局: 界面构建显示在 appcoda 演示中,用于编程自动布局的基础 Apple Doc: Programatically Auto Layout Auto Layout tutorial

【讨论】:

我正在以编程方式添加我的 tableView。我刚刚添加了你提到的这两行——但它仍然不允许我向下滚动。 -- 对于你的问题,是的,我将 UITableView 嵌入到 UIView 中,这在技术上是我的主要 ViewController 的视图。 是的。根据我在问题中运行的 print() 命令。您可以看到它们在那里增加。 如何在表格视图单元格中显示内容?在label,scrollview,webview这样的?,也请尝试从手机右上角滑动 我猜问题是我的cell 中的 UILabel 高度没有改变。在最长的时间里,我的文本被 UILabel 截断,其中 UILabel 的框架将具有设定的宽度,并且文本将以 ... 结尾。我通过设置tableView.estimatedRowHeight = 40 解决了这个问题,文本全部开始出现。但这是一个错误的发现,因为我认为它仍然认为细胞有那么高。我将更新 myanswer 以显示我的 cellForRowAtIndexPath 内容 我已经用自动布局更新了答案,请检查【参考方案2】:

表视图的frame 是它在其父视图中的实际大小。 tableview 的内容大小是其内容的大小。由于 tableview 是可滚动的,这两个值是不相关的。 frame 大小是您查看 tableview 内容的窗口的大小。内容可以在该窗口之外,然后您看不到它,但您可以滚动查看您想要的内容。

【讨论】:

有趣。那么,我想,我注意到的是我的 contentView 确实在扩展,但它不允许我滚动它的整个新跨度。关于为什么会这样的任何想法?或者我可以调查什么(具体的限制或价值观等)以找到更多关于什么可能阻止这种运动的信息? 只有当你明确指定类似的东西时才应该发生这种情况,我认为你没有。你能解释一下实际发生的事情吗?插入新内容后看不到全部内容?以前能看吗?最初你的内容是否超过了框架高度(所以你可以滚动)? 我在问题的底部为您添加了问题的 gif。我正在单击 onTouch 执行 insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Fade) 的 UITableView 单元。添加此新内容后,我似乎无法滚动到整个距离 问题是表格视图考虑了tableView.estimatedRowHeight = 40,但是你插入的单元格的高度要大得多。尝试使用更好的近似值,例如我在您发布的 GIF 中看到的 200、400 hmm.. 尝试使用近似值进行试验.. 200、400 - 没有变化。

以上是关于更改后我的框架高度没有更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有重载数据的情况下更改uitableview中的高度单元格

即使更改框架,UIView 高度也不会降低

加载数据后 Recyclerview 项目高度更改

更改包装在 UITableViewCell 中的视图的高度约束

动态单元高度有时不反映

更改 WKWebview 框架高度后如何删除 WKScrollView 内的空白区域?