动画时将 UITableViewCell 子 UIImageView 置于前面

Posted

技术标签:

【中文标题】动画时将 UITableViewCell 子 UIImageView 置于前面【英文标题】:Bringing a UITableViewCell child UIImageView to front while animating 【发布时间】:2016-10-06 06:43:34 【问题描述】:

我有一个 UITableViewCell。 在这个 tableviewcell 中,我有一个 UIImageView。

我想在按下图像时将 CGAffineTransform 应用到 UIImageView。

问题:单元格的其他项目位于我的图像之上,我希望它们在动画发生时位于后面。

我尝试过这样的事情:

//In the UITableViewCell

override func didMoveToWindow() 
    super.didMoveToWindow()

    superview?.superview?.bringSubview(toFront: photoView)
  

但这不起作用。

我也尝试过:

photoView.layer.zLocation = 10

但这也不起作用。

对于那些想知道的人,转换代码如下所示:

let scaleTransform = CGAffineTransform(scaleX: scale, y: scale)
photoView.transform = scaleTransform

有什么想法吗?

【问题讨论】:

也许是这个? cell.contentView.bringSubviewToFront(photoView) 试着让你的 imageview 在 xib 中的其他视图之上。 contentView.bringSubview(toFront:) 不起作用。 @SachinAmrale,我以编程方式使用自动布局,不,我不能那样做。因为这里的问题是我不确定当前单元格是否会在所有其他单元格之上。 【参考方案1】:

如果我没记错的话,这就是你想要的:

“当我按下图像时,我想将 CGAffineTransform 应用到 UIImageView” - 在其他单元格的子视图之上 - 意味着您应该为 imageView 设置 UITapGestureRecognizer

您的UITableViewCell 应类似于:

// your custom cell, in my case I'm calling it "TableViewCell"
class TableViewCell: UITableViewCell 
    @IBOutlet weak var imgView: UIImageView!
    // your other IBOutlets...

    //...

    // this flag is useful when you want to check if the imageView is tapped, you should return it to its normal transform -for example-
    private var isImageViewMovedToFront = false

    override func didMoveToWindow() 

        // adding the tap gesture
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(TableViewCell.imgViewTapped))
        imgView.isUserInteractionEnabled = true
        imgView.addGestureRecognizer(tapGesture)

    

    func imgViewTapped() 
        if isImageViewMovedToFront == false 
            isImageViewMovedToFront = true

            contentView.bringSubview(toFront: imgView)
            UIView.animate(withDuration: 0.25) 
                let scaleTransform = CGAffineTransform(scaleX: 1.2, y: 1.2)
                self.imgView.transform = scaleTransform
            
         else 
            isImageViewMovedToFront = false

            contentView.sendSubview(toBack: imgView)
            UIView.animate(withDuration: 0.25) 
                let scaleTransform = CGAffineTransform(scaleX: 1.0, y: 1.0)
                self.imgView.transform = scaleTransform
            
        

    

输出应该是这样的:

首次发布:

点击单元格:

重温它:

希望有所帮助。

【讨论】:

那种帮助是的。我已经有了手势的所有代码,但我的问题是bringSubview toFront。例如,如果您有另一个单元格并且您的图像超过了下一个单元格(假设您按比例缩放使图像大于当前单元格),您可以在图片顶部添加其他元素。此外,如果要重新初始化转换,可以使用单位矩阵:CGAffineTransform.identity 基本上我正在尝试做一些类似于 Instagram 捏合的事情来放大帖子图像。我不明白如何解决这个布局问题。

以上是关于动画时将 UITableViewCell 子 UIImageView 置于前面的主要内容,如果未能解决你的问题,请参考以下文章

单击另一个单元格时将 UITableViewCell 折叠到原始大小

自定义 UITableViewCell 的 viewDidLayoutSubviews

在 UITableViewCell 中为 UITableView 设置动画

当用户使用 UI-Router 转换到其父状态时将用户定向到子状态

ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

iOS UITableViewCell 发布子视图