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
            
        }

    }

}

如果我没理解错的话,这就是你的目标

  1. 你点击一个有 imageView 的 UITableViewCell
  2. 您想创建一个新的图像视图,其图像位置与您点击的单元格中的图像相同
  3. 然后从这个位置你可以让这个图像全屏显示动画
  4. 你想在动画完成后做点什么

如果是,这是我的想法

感觉这一行有第一期:

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
        }
    }
}

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

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