tableViewCell swift 的当前坐标

imn*_*ita 1 animation uitableview cgpoint cgrect swift

各位!

我正在尝试在 tableViewCell 中制作图像的动画。我的目的是获取 tableViewCell 中的 imageView,将其添加到视图中完全相同的位置,然后使用缩放动画。目前,我的代码如下所示,但是,我需要在每个时间段(也在滚动之后)找到一个单元格中心点,这样我就可以在同一位置添加图像视图。cellRect.origin.y 的值不断增加,而我需要它正好位于 tableView 单元格的 center.y 点。你能告诉我我的错误在哪里吗?

预先感谢您!

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

    let cell = tableView.cellForRow(at: indexPath) as! TableViewCell

    cell.animateImageView = { [weak self]
        guard let self = self else { return }
        tableView.layoutSubviews()
        var cellRect = self.view.convert(tableView.rectForRow(at: indexPath), to: self.tableView)
        cellRect.origin.x = UIScreen.main.bounds.midX - (cell.photoImageView.frame.width / 2)
        cellRect.origin.y = cellRect.origin.y + (cell.photoImageView.frame.height / 2)
        UIView.animate(withDuration: 3) {
            
        } completion: { isFinished in
            
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

Sha*_*ank 5

如果我理解正确的话,这就是你的目标

\n
    \n
  1. 你点击一个有 imageView 的 UITableViewCell
  2. \n
  3. 您想要创建一个新的图像视图,其中包含与您点击的单元格中的图像位于相同位置的相同图像
  4. \n
  5. 然后从这个位置开始,您将使用动画全屏显示该图像
  6. \n
  7. 您想要在动画完成后执行某些操作
  8. \n
\n

如果是的话,这是我的想法

\n

我觉得这一行有第一个问题:

\n
var cellRect \n   = self.view.convert(tableView.rectForRow(at: indexPath),\n                       to: self.tableView)\n
Run Code Online (Sandbox Code Playgroud)\n

让我们看一下文档中的转换函数

\n
\n

将矩形从receiver\xe2\x80\x99s 坐标系转换为另一个视图的坐标系。

\n

参数

\n

直角

\n

在接收器的局部坐标系(边界)中指定的矩形。

\n

看法

\n

作为转换操作目标的视图。如果视图\n为零,则此方法将转换为窗口基坐标。\n否则,视图和接收器必须属于同一个 UIWindow\n对象。

\n
\n

receiver是你cell\'s image view想要重新创建的,所以你不应该打电话self.view.convert,它应该是cell.photoImageView.convert

\n

rect参数是您点击的单元格图像视图的边界,该to参数是self.view您想要将单元格中图像视图的坐标转换为视图控制器主视图中的坐标。

\n

除此之外,我不确定这些的目的,因为您将从上述函数中获取框架,因此我删除了它们,但如果对您的应用程序有意义,您可以将其添加回来。

\n
cellRect.origin.x \n  = UIScreen.main.bounds.midX - (cell.photoImageView.frame.width / 2)\n\ncellRect.origin.y \n  = cellRect.origin.y + (cell.photoImageView.frame.height / 2)\n
Run Code Online (Sandbox Code Playgroud)\n

这就是我更改功能的方式:

\n
func tableView(_ tableView: UITableView,\n               didSelectRowAt indexPath: IndexPath)\n{\n    // Retrieved the actual cell that was tapped\n    // same as what you did\n    let cell\n        = tableView.cellForRow(at: indexPath) as! TableViewCell\n    \n    // Here I made a change based on my explanation above\n    let cellRect =\n        cell.photoImageView.convert(cell.photoImageView.bounds,\n                               to: view)\n    \n    // I created a blue view just for demo\n    let aView = UIView(frame: cellRect)\n    aView.backgroundColor = .blue\n    view.addSubview(aView)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果你在这里结束,你会得到这个结果

\n

获取表视图单元格 UITableViewCell UITableView 内子视图 UIImageView imageview 的坐标

\n

蓝色视图完美地添加到我们想要的地方

\n

现在,在我们完成棘手的部分之后,用动画完成剩下的部分就非常简单了,这是完整的功能

\n
func tableView(_ tableView: UITableView,\n               didSelectRowAt indexPath: IndexPath)\n{\n    // Retrieved the actual cell that was tapped\n    let cell\n        = tableView.cellForRow(at: indexPath) as! TableViewCell\n    \n    // Here I made a change based on my explanation above\n    let cellRect =\n        cell.photoImageView.convert(cell.photoImageView.bounds,\n                               to: view)\n    \n    let animateImageView = UIImageView(frame: cellRect)\n    animateImageView.image = cell.photoImageView.image\n    animateImageView.clipsToBounds = true\n    view.addSubview(animateImageView)\n    \n    UIView.animate(withDuration: 2.0)\n    { [weak self] in\n\n        if let strongSelf = self\n        {\n            animateImageView.frame = strongSelf.view.bounds\n        }\n\n    } completion: { (success) in\n\n        if success\n        {\n            // animation completed, do what you want\n            // like push your VC\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我相信最终的结果就是你想要的

\n

使用表视图单元 UITableViewCell UITableView 中子视图 UIImageView 的坐标对子视图进行动画处理

\n

我希望这可以帮助您更接近您想要的结果

\n