我正在开发简单的应用程序,现在我专注于在用户点击该单元格后扩展UITableViewCell。它是iOS 8应用,所以我设置了:
self.tableVIew.rowHeight = UITableViewAutomaticDimension
self.tableVIew.estimatedRowHeight = 50
单元格约束如下所示:
如果用户点击单元格,则调用此函数:
func extend() {
self.contentView.removeConstraint(self.bottomConstraint)
let additionalView = UIView()
additionalView.setTranslatesAutoresizingMaskIntoConstraints(false)
additionalView.backgroundColor = UIColor.orangeColor()
self.contentView.addSubview(additionalView)
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[additionalView(50)]-5-|", options: nil, metrics: nil, views: ["additionalView" : additionalView]))
self.contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-5-[additionalView(100)]-5@999-|", options: nil, metrics: nil, views: ["additionalView" : additionalView]))
}
self.bottomConstraint是绿色圆圈底部和单元格内容视图底部之间的成本。
问题是: 如果约束中设置了优先级,为什么此解决方案仅 :
V:|-5-[additionalView(100)]-5@999-|
如果没有明确的优先级,我就会遇到错误:
(
"<NSLayoutConstraint:0x7a63f7a0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7a737840(60)]>",
"<NSLayoutConstraint:0x7a644f40 V:|-(5)-[UIView:0x7a63f2a0] (Names: '|':UITableViewCellContentView:0x7a737840 )>",
"<NSLayoutConstraint:0x7a644fb0 V:[UIView:0x7a63f2a0(100)]>",
"<NSLayoutConstraint:0x7a644f70 V:[UIView:0x7a63f2a0]-(5)-| (Names: '|':UITableViewCellContentView:0x7a737840 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7a644f70 V:[UIView:0x7a63f2a0]-(5)-| (Names: '|':UITableViewCellContentView:0x7a737840 )>
答案 0 :(得分:2)
我制作了一个演示版,可以根据需要为您提供准确的行为。 链接在这里: https://github.com/rushisangani/TableViewCellExpand
请按照演示文稿中的说明设置展开/折叠视图的约束。
答案 1 :(得分:0)
'UIView-Encapsulated-Layout-Height'
是在表视图系统计算出它应该是什么之后创建的行高的约束。简单地改变内部约束不足以强制重新计算。
这不是新的意外行为;虽然有时可以通过让单元格挂出tableview提供的高度来实现效果,但表视图数据源委托是为了提供“官方”行高。
Apple的示例项目Table View Animations and Gestures是说明性的。它尚未针对iOS 8的自动调整单元进行更新,但无论如何都值得一看。在APLTableViewController.m中,tableViewController是单元格的俯仰手势的委托,因为它需要调整高度。其handlePinch:
调用updateForPinchScale: atIndexPath:
可以按照您的意愿进行扩展。
Table View Controller不会尝试直接更改行高。首先,它设置自己的自定义数据源对象(称为sectionInfo)以提供行高[sectionInfo replaceObjectInRowHeightsAtIndex:indexPath.row withObject:@(newHeight)];
的更新值
。然后Table View Controller执行以下操作:
BOOL animationsEnabled = [UIView areAnimationsEnabled];
[UIView setAnimationsEnabled:NO];
[self.tableView beginUpdates];
[self.tableView endUpdates];
[UIView setAnimationsEnabled:animationsEnabled];
关闭所有UIView动画是因为这是一个捏,所以它应该立即改变而不会生涩。由于您只需要进行一次性更改,因此您应该尝试不同的动画设置以获得所需的效果。
它们键是一对beginUpdates
/ endUpdates
次调用,显然会触发系统重新计算行高。使用新的iOS自定义单元格可能只需更改约束并调用这些方法就足够了;你也可以尝试夹心reloadRowsAtIndexPaths:withRowAnimation:UITableViewRowAnimationNone
答案 2 :(得分:-2)
将您的一个视图的高度优先级设置为999而不是1000。