Ios 如何在单击UICollectionViewCell时在其周围绘制一个圆,并从以前选定的单元格中删除其他圆?
我最近一直在与UICollectionView合作。有一个要求需要实现,比如:“在几个collectionview单元格中有几个ImageView。当用户选择其中一个图像/单元格时,应用程序将在该图像/单元格周围画一个蓝色圆圈。” 现在,我可以在手机上画画了。但现在的问题是,我只能绘制所有单元格,但不能同时绘制一个单元格(如下面的屏幕截图) 因此,我的问题是:如何选择一个图像/单元格,应删除上一个选定单元格的蓝色圆圈?Ios 如何在单击UICollectionViewCell时在其周围绘制一个圆,并从以前选定的单元格中删除其他圆?,ios,swift,uicollectionviewcell,Ios,Swift,Uicollectionviewcell,我最近一直在与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类,像这样:下面是我如何在单元格上画它的:这甚至不是一个复制的。这个问题不是问如何画戒指;询问者已经知道怎么做了。谢谢你,先生。你的代码确实有效。对不起,标题不清楚。