单击时我必须调整tableView的一行。我怎么能这样做?有人可以帮帮我吗?
我的视图控制器类:
class DayViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var daysWorkPointTable: UITableView
override func viewDidLoad() {
super.viewDidLoad()
var nipName = UINib(nibName: "daysWorkPointsCell", bundle: nil)
self.daysWorkPointTable.registerNib(nipName, forCellReuseIdentifier: "daysWorkCell")
}
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView:UITableView!, heightForRowAtIndexPath indexPath:NSIndexPath) -> CGFloat {
return 75
}
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell = tableView.dequeueReusableCellWithIdentifier("daysWorkCell", forIndexPath: indexPath) as daysWorkPointsCell
return cell
}
func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
}
}
答案 0 :(得分:38)
首先,您必须跟踪属性中当前所选单元格的indexPath:
var selectedCellIndexPath: NSIndexPath?
它应该是可选的,因为您无法选择单元格。 接下来,我们可以为选定状态和未选择状态声明高度(将值更改为您想要的任何值):
let selectedCellHeight: CGFloat = 88.0
let unselectedCellHeight: CGFloat = 44.0
现在你必须实施tableView(_:, heightForRowAtIndexPath:)
:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if selectedCellIndexPath == indexPath {
return selectedCellHeight
}
return unselectedCellHeight
}
现在,在您的tableView(_:, didSelectRowAtIndexPath:)
方法中,您必须检查所选行或未点击的行已被点击:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath {
selectedCellIndexPath = nil
} else {
selectedCellIndexPath = indexPath
}
tableView.beginUpdates()
tableView.endUpdates()
if selectedCellIndexPath != nil {
// This ensures, that the cell is fully visible once expanded
tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .None, animated: true)
}
}
beginUpdates()
和endUpdates()
来电为您提供动画高度变化。
如果要更改高度变化动画的持续时间,可以将beginUpdates()
和endUpdates()
调用包装在动画块UIView.animationWithDuration(...)
中,并将其设置为您想要的任何值。 / p>
您可以查看演示此代码的this sample project。