TablviewCell在用户触摸时的高度变化

时间:2017-12-16 18:25:21

标签: uiview tableview cell uigesturerecognizer swift4

使用Swift4,iOS11.1,Xcode9.1,

我想实现一个tableView-cell的动态高度变化。问题如下:我的tableView中的每个单元格都包含一个UIView(称为MyCellView)。在用户触摸单元格时,触摸单元格的MyCellView将改变其高度!

我成功实现了一个UIGestureRecognizer,它为我提供了动作。在动作方法中,我改变了触摸细胞的高度(到目前为止一直很好)。视图实际上改变了它的高度。

但不幸的是,如果MyCellView的新高度大于原始单元格高度,则会截断MyCellView!

如何在tableView中动态实现单个单元格的单元格高度变化?

这是我的手势识别器动作代码:

@objc func toWebviewTouch(_ sender : UITapGestureRecognizer) {

    self.MyCellView.frame = CGRect(x: self.MyCellView.frame.origin.x, 
                                   y: self.MyCellView.frame.origin.y,
                               width: self.MyCellView.frame.width,
                              height: self.myNewHeight)

    self.contentView.bringSubview(toFront: self.MyCellView)

    self.contentView.setNeedsLayout()
    self.setNeedsUpdateConstraints()
    self.updateConstraintsIfNeeded()
}

我也遵循了这个link的想法。但这只会在tableView填充时改变tableView单元格的高度(而不是在建立tableView并且用户触摸单元格之后)。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

哦,我找到了解决方案:

link的帮助下,我实现了目标!

关键是在'didSelectRowAt'

中使用以下内容
tableView.beginUpdates()
tableView.endUpdates()

之后,我需要从自定义单元格内部创建通知(即,当用户触摸单元格时,自定义单元格的gestureRecognizer会触发本地通知(将单元格标记为Nr作为传递的消息) - 再次,使tableView.updates()

请参阅我的代码最底层的通知方法 - 例外......

这是我的代码(例外):

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // fixed to three to test...
    return 3
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = fromToTableView.dequeueReusableCell(withIdentifier: "FromToCell") as? FromToCustomTableViewCell

    cell?.configureCell(tag: indexPath.row)
    return cell!
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if self.cellIsSelected == indexPath {
        return 450
    }
    return 144
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.cellIsSelected = self.cellIsSelected == indexPath ? nil : indexPath
    tableView.beginUpdates()
    tableView.endUpdates()
}

// MARK: Notifications methods

@objc func expandCellHeightFromNotification(_ notification: NSNotification) {
    if let tag = notification.userInfo?["tag"] as? Int {
        self.cellIsSelected = IndexPath(item: tag, section: 0)
    }
    self.fromToTableView.beginUpdates()
    self.fromToTableView.endUpdates()
}

@objc func collapseCellHeightFromNotification(_ notification: NSNotification) {
    self.cellIsSelected = nil
    self.fromToTableView.beginUpdates()
    self.fromToTableView.endUpdates()
}