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)
如果我理解正确的话,这就是你的目标
\n如果是的话,这是我的想法
\n我觉得这一行有第一个问题:
\nvar cellRect \n = self.view.convert(tableView.rectForRow(at: indexPath),\n to: self.tableView)\nRun Code Online (Sandbox Code Playgroud)\n让我们看一下文档中的转换函数
\n\n\n将矩形从receiver\xe2\x80\x99s 坐标系转换为另一个视图的坐标系。
\n参数
\n直角
\n在接收器的局部坐标系(边界)中指定的矩形。
\n看法
\n作为转换操作目标的视图。如果视图\n为零,则此方法将转换为窗口基坐标。\n否则,视图和接收器必须属于同一个 UIWindow\n对象。
\n
这receiver是你cell\'s image view想要重新创建的,所以你不应该打电话self.view.convert,它应该是cell.photoImageView.convert
该rect参数是您点击的单元格图像视图的边界,该to参数是self.view您想要将单元格中图像视图的坐标转换为视图控制器主视图中的坐标。
除此之外,我不确定这些的目的,因为您将从上述函数中获取框架,因此我删除了它们,但如果对您的应用程序有意义,您可以将其添加回来。
\ncellRect.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)\nRun Code Online (Sandbox Code Playgroud)\n这就是我更改功能的方式:
\nfunc 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}\nRun Code Online (Sandbox Code Playgroud)\n如果你在这里结束,你会得到这个结果
\n\n蓝色视图完美地添加到我们想要的地方
\n现在,在我们完成棘手的部分之后,用动画完成剩下的部分就非常简单了,这是完整的功能
\nfunc 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}\nRun Code Online (Sandbox Code Playgroud)\n我相信最终的结果就是你想要的
\n\n我希望这可以帮助您更接近您想要的结果
\n| 归档时间: |
|
| 查看次数: |
1180 次 |
| 最近记录: |