tableViewCell 的当前坐标 swift
Current coordinates of a tableViewCell 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
}
}
}
如果我没理解错的话,这就是你的目标
- 你点击一个有 imageView 的 UITableViewCell
- 您想创建一个新的图像视图,其图像位置与您点击的单元格中的图像相同
- 然后从这个位置你可以让这个图像全屏显示动画
- 你想在动画完成后做点什么
如果是,这是我的想法
感觉这一行有第一期:
var cellRect
= self.view.convert(tableView.rectForRow(at: indexPath),
to: self.tableView)
我们来看看docs
中的convert函数
Converts a rectangle from the receiver’s coordinate system to that of another view.
Parameters
rect
A rectangle specified in the local coordinate system
(bounds) of the receiver.
view
The view that is the target of the conversion operation. If view
is nil, this method instead converts to window base coordinates.
Otherwise, both view and the receiver must belong to the same UIWindow
object.
此处的 receiver
是您要重新创建的 cell's image view
,因此您不应调用 self.view.convert
,它应该是 cell.photoImageView.convert
rect
参数是您点击的单元格图像视图的边界,to
参数是 self.view
,因为您希望将图像视图在单元格中的坐标转换为坐标在视图控制器的主视图中。
除此之外,我不确定这些的用途,因为您将从上述函数中获取框架,所以我删除了它们,但如果它对您的应用程序有意义,您可以将其添加回来。
cellRect.origin.x
= UIScreen.main.bounds.midX - (cell.photoImageView.frame.width / 2)
cellRect.origin.y
= cellRect.origin.y + (cell.photoImageView.frame.height / 2)
这就是我更改函数的方式:
func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath)
{
// Retrieved the actual cell that was tapped
// same as what you did
let cell
= tableView.cellForRow(at: indexPath) as! TableViewCell
// Here I made a change based on my explanation above
let cellRect =
cell.photoImageView.convert(cell.photoImageView.bounds,
to: view)
// I created a blue view just for demo
let aView = UIView(frame: cellRect)
aView.backgroundColor = .blue
view.addSubview(aView)
}
如果你在这里结束,你会得到这个结果
蓝色视图完美添加到我们想要的地方
在我们完成棘手的部分后,现在用动画完成剩下的部分就很简单了,这里是完整的功能
func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath)
{
// Retrieved the actual cell that was tapped
let cell
= tableView.cellForRow(at: indexPath) as! TableViewCell
// Here I made a change based on my explanation above
let cellRect =
cell.photoImageView.convert(cell.photoImageView.bounds,
to: view)
let animateImageView = UIImageView(frame: cellRect)
animateImageView.image = cell.photoImageView.image
animateImageView.clipsToBounds = true
view.addSubview(animateImageView)
UIView.animate(withDuration: 2.0)
{ [weak self] in
if let strongSelf = self
{
animateImageView.frame = strongSelf.view.bounds
}
} completion: { (success) in
if success
{
// animation completed, do what you want
// like push your VC
}
}
}
我相信最后的结果就是你想要的
我希望这可以帮助您更接近您想要的结果
小伙伴们!
我正在尝试为我的 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
}
}
}
如果我没理解错的话,这就是你的目标
- 你点击一个有 imageView 的 UITableViewCell
- 您想创建一个新的图像视图,其图像位置与您点击的单元格中的图像相同
- 然后从这个位置你可以让这个图像全屏显示动画
- 你想在动画完成后做点什么
如果是,这是我的想法
感觉这一行有第一期:
var cellRect
= self.view.convert(tableView.rectForRow(at: indexPath),
to: self.tableView)
我们来看看docs
中的convert函数Converts a rectangle from the receiver’s coordinate system to that of another view.
Parameters
rect
A rectangle specified in the local coordinate system (bounds) of the receiver.
view
The view that is the target of the conversion operation. If view is nil, this method instead converts to window base coordinates. Otherwise, both view and the receiver must belong to the same UIWindow object.
此处的 receiver
是您要重新创建的 cell's image view
,因此您不应调用 self.view.convert
,它应该是 cell.photoImageView.convert
rect
参数是您点击的单元格图像视图的边界,to
参数是 self.view
,因为您希望将图像视图在单元格中的坐标转换为坐标在视图控制器的主视图中。
除此之外,我不确定这些的用途,因为您将从上述函数中获取框架,所以我删除了它们,但如果它对您的应用程序有意义,您可以将其添加回来。
cellRect.origin.x
= UIScreen.main.bounds.midX - (cell.photoImageView.frame.width / 2)
cellRect.origin.y
= cellRect.origin.y + (cell.photoImageView.frame.height / 2)
这就是我更改函数的方式:
func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath)
{
// Retrieved the actual cell that was tapped
// same as what you did
let cell
= tableView.cellForRow(at: indexPath) as! TableViewCell
// Here I made a change based on my explanation above
let cellRect =
cell.photoImageView.convert(cell.photoImageView.bounds,
to: view)
// I created a blue view just for demo
let aView = UIView(frame: cellRect)
aView.backgroundColor = .blue
view.addSubview(aView)
}
如果你在这里结束,你会得到这个结果
蓝色视图完美添加到我们想要的地方
在我们完成棘手的部分后,现在用动画完成剩下的部分就很简单了,这里是完整的功能
func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath)
{
// Retrieved the actual cell that was tapped
let cell
= tableView.cellForRow(at: indexPath) as! TableViewCell
// Here I made a change based on my explanation above
let cellRect =
cell.photoImageView.convert(cell.photoImageView.bounds,
to: view)
let animateImageView = UIImageView(frame: cellRect)
animateImageView.image = cell.photoImageView.image
animateImageView.clipsToBounds = true
view.addSubview(animateImageView)
UIView.animate(withDuration: 2.0)
{ [weak self] in
if let strongSelf = self
{
animateImageView.frame = strongSelf.view.bounds
}
} completion: { (success) in
if success
{
// animation completed, do what you want
// like push your VC
}
}
}
我相信最后的结果就是你想要的
我希望这可以帮助您更接近您想要的结果