我在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
}
问题的视觉效果......
答案 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仅在你启用了自动布局时起作用,因此可能无法计算正确的高度
tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableViewAutomaticDimension
一旦设置了这两个属性,系统就会使用“自动布局”来计算行的实际高度。
有关使用自动布局进行自我调整大小的演示,您可以查看以下链接:
来自Appcoda
但是,如果没有自动布局,自定义单元格将无法正常工作 依靠约束来确定正确的行高。
可以从Interface Builder和Programatically完成自动布局:
接口构建显示在appcoda演示中,以编程方式AutoLayout为基础
Apple Doc: Programatically Auto Layout
Auto Layout tutorial