更改后,我的框架高度未更新

时间:2016-03-26 08:32:40

标签: ios swift uitableview constraints

我在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,如下所示:

enter image description here

..即使你可以清楚地看到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
}

问题的视觉效果......

enter image description here

2 个答案:

答案 0 :(得分:1)

表视图的frame是其超级视图中的实际大小。 tableview的内容大小是其内容的大小。由于tableview是可滚动的,因此这两个值不相关。 frame大小是窗口的大小,您可以通过该窗口查看tableview的内容。内容可以在该窗口之外,然后您无法看到它,但您可以滚动查看所需的内容。

答案 1 :(得分:1)

当您向tableview添加新行时,contentSize将增加,tableview的框架将与tableview将在内容大小增加后滚动

相同

对于编程,它将像

tableView.userInteractionEnabled  = true
tableView.scrollEnabled = true

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

更新::自动布局 看起来Autolayout是UITableViewAutomaticDimension的问题,根据apple doc,一个教程和一个答案在SO中这个AutomaticDimension仅在你启用了自动布局时起作用,因此可能无法计算正确的高度

Apple Doc:Self sizing

  

tableView.estimatedRowHeight = 85.0
tableView.rowHeight =   UITableViewAutomaticDimension

   一旦设置了这两个属性,系统就会使用“自动布局”来计算行的实际高度。

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

Self sizing cell demo:Appcoda

来自Appcoda

  

但是,如果没有自动布局,自定义单元格将无法正常工作   依靠约束来确定正确的行高。

可以从Interface Builder和Programatically完成自动布局: 接口构建显示在appcoda演示中,以编程方式AutoLayout为基础 Apple Doc: Programatically Auto Layout
Auto Layout tutorial