web-dev-qa-db-ja.com

選択したUICollectionViewセルを強調表示するにはどうすればよいですか? (迅速)

UICollectionViewがあり、ユーザーは複数のセルを選択できます。選択されたセルを追跡するのは少し難しいので、セルがタップされたときに境界線を強調表示/作成する方法が必要です。

コード:

func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {

    addToList.append(objectsArray[indexPath.row])

    return true

}
20
bkwebhero

以下のコードのような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
}
46
Özgür Ersil

ここに私の解決策があり、それが機能すると確信しています。

私のソリューションには、UICollectionCellselectedBackgroundViewcell.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
        }
    }
}
14
DawnSong

カスタマイズされた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)

あなたはそれで同じことをすることができます。

5
Strong

つかいます

collectionView.reloadItemsAtIndexPaths([indexPath])

現在のセルをリロードする、または

collectionView.reloadData()

shouldSelectItemAtIndexPathのすべてのセルをリロードするには

次に、セルがチェック済みとしてマークされている場合、cellForItemAtIndexPathで境界線または背景色を設定します(できればindexPathsのチェック済みセルに新しい配列が必要になる場合があります)。

5
Sunkas

セルを複数選択するには、次のようにします。

 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)
     }
   }
}
1
H S Progr

スイフト

このコードを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)
        }
    }
}

これにより、選択した単一のセルの色が設定され、以前に選択したセルから選択した色が削除されます。

0
drfalcoew

セル全体を覆うのに十分な太さの境界線を作成してください

コード:

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
}
0
Deepansh Jagga