UICollectionViewがあり、ユーザーは複数のセルを選択できます。選択されたセルを追跡するのは少し難しいので、セルがタップされたときに境界線を強調表示/作成する方法が必要です。
コード:
func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
addToList.append(objectsArray[indexPath.row])
return true
}
以下のコードのようなdidSelectItemAtIndexPath
オーバーライドイベントで境界線の変更を使用し、セルに新しい設定を割り当てることができます。
Swift 3.x:
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
addToList.append(objectsArray[indexPath.row])
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderWidth = 2.0
cell?.layer.borderColor = UIColor.gray.cgColor
}
ここに私の解決策があり、それが機能すると確信しています。
私のソリューションには、UICollectionCell
のselectedBackgroundView
、cell.contentView.backgroundColor
、または独自のspecialHighlightedArea
。
使い方? BaseCollectionViewCell
を継承するだけです。必要に応じて、セルのinit
またはcollectionView
のデリゲートメソッドで構成します。
ハイライト効果が必要ない場合は、 ICollectionViewDelegate で「 shouldHighlightItemAtIndexPath 」という名前のメソッドを見つけ、false
を返すか、単にcell.shouldTintBackgroundWhenSelected = false
。
extension UIColor {
convenience init(rgb: Int, alpha: CGFloat = 1.0) {
self.init(red: CGFloat((rgb & 0xFF0000) >> 16) / 255.0, green: CGFloat((rgb & 0xFF00) >> 8) / 255.0, blue: CGFloat(rgb & 0xFF) / 255.0, alpha: alpha)
}
}
/// same with UITableViewCell's selected backgroundColor
private let highlightedColor = UIColor(rgb: 0xD8D8D8)
class BaseCollectionViewCell: UICollectionViewCell {
var shouldTintBackgroundWhenSelected = true // You can change default value
var specialHighlightedArea: UIView?
// make lightgray background show immediately(使灰背景立即出现)
override var isHighlighted: Bool {
willSet {
onSelected(newValue)
}
}
// keep lightGray background until unselected (保留灰背景)
override var isSelected: Bool {
willSet {
onSelected(newValue)
}
}
func onSelected(_ newValue: Bool) {
guard selectedBackgroundView == nil else { return }
if shouldTintBackgroundWhenSelected {
contentView.backgroundColor = newValue ? cellHighlightedColor : UIColor.clear
}
if let sa = specialHighlightedArea {
sa.backgroundColor = newValue ? UIColor.black.withAlphaComponent(0.4) : UIColor.clear
}
}
}
カスタマイズされたcollcetionViewCellを作成し、オーバーライドできます。
class MyCell: UICollectionViewCell {
override var isHighlighted: Bool {
didSet {
if self.isHighlighted {
print("yes")
// Your customized animation or add a overlay view
} else {
print("no")
// Your customized animation or remove overlay view
}
}
}
}
これにより、UITableViewCellの強調表示効果のような同様の結果を作成できます。
サブクラス化なし:
独自のcollectionViewCellを作成したくない場合。デリゲートメソッドを使用できます。
func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath)
func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath)
あなたはそれで同じことをすることができます。
つかいます
collectionView.reloadItemsAtIndexPaths([indexPath])
現在のセルをリロードする、または
collectionView.reloadData()
shouldSelectItemAtIndexPath
のすべてのセルをリロードするには
次に、セルがチェック済みとしてマークされている場合、cellForItemAtIndexPath
で境界線または背景色を設定します(できればindexPathsのチェック済みセルに新しい配列が必要になる場合があります)。
セルを複数選択するには、次のようにします。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
if let currentCell = collectionView.cellForItem(at: indexPath) as? QuestionnaireCollectionViewCell {
// Your selection logic, you can change it according to your requirement
if currentCell.selectedImage.isHidden == true{
currentCell.selectedImage.isHidden = false
}
else{
currentCell.selectedImage.isHidden = true
}
}
}
}
単一選択の場合、collectionviewcellクラスで次のようにisSelectedを使用できます。
override var isSelected: Bool{
didSet{
if self.isSelected
{
//This block will be executed whenever the cell’s selection state is set to true (i.e For the selected cell)
}
else
{
//This block will be executed whenever the cell’s selection state is set to false (i.e For the rest of the cells)
}
}
}
スイフト
このコードをUICollectionViewCellサブクラスに追加します。
override var isSelected: Bool {
didSet{
if self.isSelected {
self.backgroundColor = UIColor(r: 115, g: 190, b: 170)
}
else {
self.backgroundColor = UIColor(r: 60, g: 63, b: 73)
}
}
}
これにより、選択した単一のセルの色が設定され、以前に選択したセルから選択した色が削除されます。
セル全体を覆うのに十分な太さの境界線を作成してください
コード:
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
addToList.append(objectsArray[indexPath.row])
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderWidth = 200.0
cell?.layer.borderColor = UIColor.init(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.4).cgColor
}