Józ*_*sza 14 uitableview ios autolayout ios-autolayout
在我的最新发现之后,我完全修改了这个问题.
我的目标是实现以下效果:
请注意,我知道,这可以通过插入/删除所选单元格下方的单元格来实现,我已经使用该方法成功实现了.
这次,我想尝试使用Auto Layout约束来实现这一点.
我有一个示例项目可供任何人查看,也打开了一个问题.总结一下,这是我到目前为止所尝试的内容:
我在这里作为演员有以下观点:
我已经按照以下方式在我的单元格中设置了自动布局约束(请注意,这是严格的伪语言):
我有一个自定义UITableViewCell子类,有多个出口,但最重要的是前面提到的高度约束的出口:这里的想法是constant默认将其设置为0,但是当选择单元格时,将其设置为44,所以它变得可见:
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
detailViewHeightConstraint.constant = selected ? detailViewDefaultHeight : 0
UIView.animateWithDuration(0.3) {
self.layoutIfNeeded()
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下结果:

所以效果是有效的,但不完全是我最初的想象.我没有推动主视图,而是希望细胞的高度在显示细节视图时增长,并在隐藏时收缩.
我在运行时检查了我的布局层次结构:


我需要的是:表格视图单元格内容视图的高度应该等于
我如何设置约束来实现这一目标?
Józ*_*sza 13
经过大量的研究,我想我已经在这篇伟大的文章的帮助下找到了解决方案.
以下是使单元格调整大小所需的步骤:
在Main和Detail Views中,我最初将标签设置为水平和垂直居中.这对于自我调整细胞是不够的.我需要的第一件事是使用垂直间距约束而不是简单对齐来设置我的布局:

此外,您应将主容器的垂直压缩阻力设置为1000.
细节视图有点棘手:除了创建适当的垂直约束外,您还必须使用它们的优先级来达到所需的效果:

主要想法如下:
我必须修改我的UITableViewCell子类以支持这些操作:
// `showDetails` is exposed to control, whether the cell should be expanded
var showsDetails = false {
didSet {
detailViewHeightConstraint.priority = showsDetails ? lowLayoutPriority : highLayoutPriority
}
}
override func awakeFromNib() {
super.awakeFromNib()
detailViewHeightConstraint.constant = 0
}
Run Code Online (Sandbox Code Playgroud)
要触发行为,我们必须覆盖tableView(_:didSelectRowAtIndexPath:):
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: false)
switch expandedIndexPath {
case .Some(_) where expandedIndexPath == indexPath:
expandedIndexPath = nil
case .Some(let expandedIndex) where expandedIndex != indexPath:
expandedIndexPath = nil
self.tableView(tableView, didSelectRowAtIndexPath: indexPath)
default:
expandedIndexPath = indexPath
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经介绍expandedIndexPath了跟踪我们当前扩展的索引:
var expandedIndexPath: NSIndexPath? {
didSet {
switch expandedIndexPath {
case .Some(let index):
tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic)
case .None:
tableView.reloadRowsAtIndexPaths([oldValue!], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
}
Run Code Online (Sandbox Code Playgroud)
设置属性将导致表视图重新加载适当的索引,为我们提供了一个告诉单元格的完美机会,是否应该展开:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ExpandableTableViewCell
cell.mainTitle = viewModel.mainTitleForRow(indexPath.row)
cell.detailTitle = viewModel.detailTitleForRow(indexPath.row)
switch expandedIndexPath {
case .Some(let expandedIndexPath) where expandedIndexPath == indexPath:
cell.showsDetails = true
default:
cell.showsDetails = false
}
return cell
}
Run Code Online (Sandbox Code Playgroud)
最后一步是在以下方面启用自我调整viewDidLoad():
override func viewDidLoad() {
super.viewDidLoad()
tableView.contentInset.top = statusbarHeight
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 125
}
Run Code Online (Sandbox Code Playgroud)
结果如下:

细胞现在可以自己调整大小 你可能会注意到动画仍然有点奇怪,但修复它不属于这个问题的范围.
结论:这比应该的更难.我真的希望看到未来会有一些改进.
| 归档时间: |
|
| 查看次数: |
4987 次 |
| 最近记录: |