Ios 如何在单击UICollectionViewCell时在其周围绘制一个圆,并从以前选定的单元格中删除其他圆?

Ios 如何在单击UICollectionViewCell时在其周围绘制一个圆,并从以前选定的单元格中删除其他圆?,ios,swift,uicollectionviewcell,Ios,Swift,Uicollectionviewcell,我最近一直在与UICollectionView合作。有一个要求需要实现,比如:“在几个collectionview单元格中有几个ImageView。当用户选择其中一个图像/单元格时,应用程序将在该图像/单元格周围画一个蓝色圆圈。” 现在,我可以在手机上画画了。但现在的问题是,我只能绘制所有单元格,但不能同时绘制一个单元格(如下面的屏幕截图) 因此,我的问题是:如何选择一个图像/单元格,应删除上一个选定单元格的蓝色圆圈? 非常感谢您提前给出答案。听起来您希望这样: 你没说你是怎么把蓝色的圆圈放

我最近一直在与UICollectionView合作。有一个要求需要实现,比如:“在几个collectionview单元格中有几个ImageView。当用户选择其中一个图像/单元格时,应用程序将在该图像/单元格周围画一个蓝色圆圈。” 现在,我可以在手机上画画了。但现在的问题是,我只能绘制所有单元格,但不能同时绘制一个单元格(如下面的屏幕截图)

因此,我的问题是:如何选择一个图像/单元格,应删除上一个选定单元格的蓝色圆圈?


非常感谢您提前给出答案。

听起来您希望这样:

你没说你是怎么把蓝色的圆圈放进牢房的。我认为您应该如何处理选择:尽可能多地使用集合视图的内置选择支持

UICollectionView
已经支持选择单元格。默认情况下,它的
AllowSelection
属性为true,而
allowsMultipleSelection
属性为false,因此它允许用户通过点击项目一次选择一个项目。这听起来几乎正是你想要的

集合视图使当前选择在其
indexPathsForSelectedItems
属性中可用,该属性在未选择单元格时为零或为空,在选择一个项目时仅包含一个索引路径

当选中某个项目,并且该项目有一个可见的单元格时,该单元格通过使其
selectedBackgroundView
可见来显示其项目已被选中。因此,创建一个显示蓝色圆圈的
UIView
子类:

class CircleView: UIView {

    override class var layerClass: AnyClass { return CAShapeLayer.self }

    override func layoutSubviews() {
        super.layoutSubviews()

        let layer = self.layer as! CAShapeLayer
        layer.strokeColor = UIColor.blue.cgColor
        layer.fillColor = nil
        let width: CGFloat = 3
        layer.lineWidth = width
        layer.path = CGPath(ellipseIn: bounds.insetBy(dx: width / 2, dy: width / 2), transform: nil)
    }
}
然后使用
CircleView
的实例作为单元格的
selectedBackgroundView
。第一次选择单元格时,可以延迟创建实例:

class MyCell: UICollectionViewCell {
    override var isSelected: Bool {
        willSet {
            if newValue && selectedBackgroundView == nil {
                selectedBackgroundView = CircleView()
            }
        }
    }

    var title: String = "???" {
        didSet {
            label.text = title
        }
    }

    @IBOutlet private var label: UILabel!
}
有了这个代码,用户可以点击一个单元格来选择它的项目,当选中时,单元格将显示一个蓝色的圆圈。点击另一个单元格将取消选择以前选定的项目,蓝色圆圈将“移动”到新选定项目的单元格

您可能想让用户通过再次点击来取消选择所选项目<如果
allowsMultipleSelection
为false,则默认情况下,code>UICollectionView不会执行此操作。启用再次点击以取消选择的一种方法是在
UICollectionViewDelegate
中实现
collectionView(uU2;:shouldSelectItemAt:)

    override func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
        if (collectionView.indexPathsForSelectedItems ?? []).contains(indexPath) {
            // Item is already selected, so deselect it.
            collectionView.deselectItem(at: indexPath, animated: false)
            return false
        } else {
            return true
        }
    }

你能提供一些代码,你是如何画圆的吗?我创建了一个CircleView类,像这样:下面是我如何在单元格上画它的:这甚至不是一个复制的。这个问题不是问如何画戒指;询问者已经知道怎么做了。谢谢你,先生。你的代码确实有效。对不起,标题不清楚。