用户用手指拿起动画表格视图单元格(Swift 3)

时间:2017-11-08 13:15:09

标签: ios swift uitableview animation swift3

我正在尝试制作这个动画enter image description here

所以我希望当用户用手指拿起单元格变小然后当它停止按下时返回原始尺寸,重要的是我没有使用自定义单元格但是默认的UITableViewCell,这里是我的代码,我试图做动画(看完旧问题和教程后)

 var originalCellSize: CGRect!  

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

        print("I'm Highlighted at \(indexPath.section)")


        guard let cell = tableView.cellForRow(at: indexPath)  else {
            return
        }

        originalCellSize = cell.frame
        UIView.animate(withDuration: 0.1, animations: {
            cell.frame = CGRect(x: cell.frame.origin.x + 20, y: cell.frame.origin.y, width: cell.frame.width - 40, height: cell.frame.height)
        })
    }


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

        guard let cell = tableView.cellForRow(at: indexPath) else {
            return
        }

        UIView.animate(withDuration: 0.1, animations: {
            cell.frame = CGRect(x: 0, y: self.originalCellSize.origin.y, width: self.view.bounds.width, height: 180)
        })

        originalCellSize = .zero
    }

我不知道为什么但是有些东西是错误的并且动画不起作用,有人可以帮助我(在推动单元格之后也会发生这种情况,这会以明确的方式改变位置)

4 个答案:

答案 0 :(得分:0)

您可以通过其他方式解决问题。您可以在表视图单元格内调整视图的大小。

就像你可以保持白色和细胞背景为灰色的视图。在高亮显示委托方法中,您可以在单元格内更改UIView的框架,在unhighlight方法中,您可以调整大小以返回单元格大小。

答案 1 :(得分:0)

当您想要更改单元格的布局时,您必须调用cell.layoutIfNeeded()

答案 2 :(得分:0)

  1. 设置单元格应更改大小的标志。
  2. table.beginUpdates()
  3. 添加标记检查
  4. 突出显示使用:

    table.reloadRowsAt(...)

    table.endUpdates()

    gradle -q dependencies :RedactedAppName:dependencies --configuration compile

  5. 应该工作得很好。

    我不确定你是否可以改变细胞的框架。因此,您也可以尝试更改单元格的内容视图大小。或者您的自定义视图框架。

答案 3 :(得分:0)

不要直接操纵UITableViewCell的框架。 使用它的transform属性。 同样地:

在突出显示/选择时缩小单元格。

UIView.animate(withDuration: 0.3) {
    cell.transform = CGAffineTransform(scaleX: 0.8, y: 0.8)
    cell.layoutIfNeeded()
}

缩放回正常:

UIView.animate(withDuration: 0.3) {
    cell.transform = CGAffineTransform.identity
    cell.layoutIfNeeded()
}

不要忘记在动画块之前和内部(在分配CGAffineTransform之后)调用cell.layoutIfNeeded()