我已经为集合视图细胞图像添加了UITapGestureRecognizer,如

代码:使用此代码,如果我点击两个细胞图像,则两个都会显示.如果我点击第二个细胞图像,那么如何从前景中删除第一个图像

当我在新的ImageView(但在集合视图上)之外点击时,这里touchesBegan没有呼叫,为什么?对此有什么解决办法吗?

o/p screen of the code

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FriendCollectionViewCell.cellId, for: indexPath) as! FriendCollectionViewCell

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(cellTappedMethod(_:)))
cell.profileImageView?.gestureRecognizers?.removeAll()
cell.profileImageView.isUserInteractionEnabled = true
cell.profileImageView.tag = indexPath.row
cell.profileImageView.addGestureRecognizer(tapGestureRecognizer)


return cell

}

@objc func cellTappedMethod(_ sender: UITapGestureRecognizer){

let imageView = sender.view as! UIImageView
let newImageView = UIImageView(image: imageView.image)
newImageView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width * 0.7, height: 300.0)//UIScreen.main.bounds
UIView.animate(withDuration: 0.2) { [self] in
    
    newImageView.center = CGPoint(x: UIScreen.main.bounds.center.x - 15, y: UIScreen.main.bounds.center.y - 200)
    
    newImageView.backgroundColor = UIColor.clear
    newImageView.contentMode = .scaleAspectFit
    newImageView.isUserInteractionEnabled = true
    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
    newImageView.addGestureRecognizer(tap)
    
    self.view.addSubview(newImageView)
}
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{

let touch = touches.first
print("touch..outside")

var sender = UITapGestureRecognizer()
print(sender.view?.tag)

if ((touch?.view) != nil){
    print("touch..")
    sender.view?.removeFromSuperview()
}
}



@objc func dismissFullscreenImage(sender: UITapGestureRecognizer) {
UIView.animate(withDuration: 0.2) { [self] in
    sender.view?.removeFromSuperview()
}
}

如果我点击细胞图像,那么如何删除所有在前景中的图像.请给我带路

推荐答案

要实现在点击新的单元图像时从前景中删除先前图像的所需行为,您可以跟踪当前显示的图像视图,并在添加新图像之前将其删除.

var currentImageView: UIImageView?

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FriendCollectionViewCell.cellId, for: indexPath) as! FriendCollectionViewCell
    
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(cellTappedMethod(_:)))
    cell.profileImageView?.gestureRecognizers?.removeAll()
    cell.profileImageView.isUserInteractionEnabled = true
    cell.profileImageView.tag = indexPath.row
    cell.profileImageView.addGestureRecognizer(tapGestureRecognizer)
    
    return cell
}

@objc func cellTappedMethod(_ sender: UITapGestureRecognizer) {
    let imageView = sender.view as! UIImageView
    
    currentImageView?.removeFromSuperview()
    
    let newImageView = UIImageView(image: imageView.image)
    newImageView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width * 0.7, height: 300.0)
    newImageView.center = CGPoint(x: UIScreen.main.bounds.center.x - 15, y: UIScreen.main.bounds.center.y - 200)
    newImageView.backgroundColor = UIColor.clear
    newImageView.contentMode = .scaleAspectFit
    newImageView.isUserInteractionEnabled = true
    
    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
    newImageView.addGestureRecognizer(tap)
    self.view.addSubview(newImageView)
    currentImageView = newImageView
}

@objc func dismissFullscreenImage(sender: UITapGestureRecognizer) {
    sender.view?.removeFromSuperview()
    currentImageView = nil
}

在这段代码中,在类级别声明了currentImageView变量,以跟踪当前显示在屏幕上的图像视图.当点击细胞图像时,在添加新图像之前,先前的图像视图(如果有)将从SuperView中删除.用新的图像视图更新变量currentImageView,并且当取消全屏图像时,清除引用以指示当前没有显示图像视图.

至于在newImageView之外点击时不调用touchesBegan的问题,是因为newImageView位于集合视图的顶部,并拦截touch 事件.一种解决方案是子类UICollectionView并重写子类中的touchesBegan方法.

class MyCollectionView: UICollectionView {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
    }
}

Swift相关问答推荐

字符串目录不适用于SWIFT包

减go 用SWIFT struct 填充的NSCountedSet

如何分解阿拉伯字母?

如何在init()中使用setter/getters?

为SwiftUI文本视图提供固定宽度,并仅在文本换行时使文本视图底部增大

SwiftUI同心圆,通过逐渐出现来显示进度

一种函数,用于判断变量的类型是否为在SWIFT中作为参数传递的类型

在Swift中,将秒设置为0也等于将1添加到分钟

解码器是否需要具有密钥的外部数据表示?

SwiftUI 交易:根据外部状态制作一个动画或静止的按钮

如何返回一个通过 SwiftUI 中的另一个协议间接继承 View 协议的 struct ?

快速递归:函数与闭包

任何使 ScrollView 像 List 一样执行更灵活的修饰符?

为什么swiftui中的导航视图栏那么大?

Swift中的分段错误

EXC_BREAKPOINT 崩溃的原因范围

如何在 Swift 中将 UILabel 居中?

如何在Swift中找出字母是字母数字还是数字

如何将 Int 拆分为其各个数字?

通过单击表格视图中的单元格打开新的视图控制器 - Swift iOS