web-dev-qa-db-ja.com

タップでuicollectionviewセルを強調表示

UICollectionViewControllerとして実装したスライドアウトメニューがあります。コレクションビューのカスタムセルも作成しました。ナビゲーションとすべてが期待どおりに機能します。私が困っているのは、実際のセルをクリックしたときにセルの外観を変更することです。

私は解決策に基づいていくつかのアプローチを試しました( 1 )( 2 )私はここにスタックで見ましたが、満足のいくものは何もありません。

ソリューション1:UICollectionViewControllerデリゲートメソッドを実装します。

class SlideOutMenuViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout{
   //Setup code and other delegate methods….

    override func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells

        cell.backgroundColor = .white
    }

    override func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SlideOutMenuCells

        cell.backgroundColor = UIColor.mainGreen()
    }
}

この解決策を試しても何も起こりません。セルの背景色は色を変えません。

ソリューション2:このソリューションは、セルを押したときにセルの色が変わることを除いて、より良い結果をもたらします。 tapでセルの背景色をすばやく点滅または強調表示して、実際にユーザーがセルを押し続けている場合。

class SlideOutMenuCells: UICollectionViewCell {

    //Setup code...

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                backgroundColor = UIColor.darkGreen()
            } else {
                backgroundColor = UIColor.mainGreen()
            }
        }
    }
}

どちらのソリューションも実際には意図したとおりに機能しません。私はここでこれに対処しようとするいくつかの投稿を見てきましたが、実際に機能する解決策を持つものを見つけていません。ユーザーがセルをクリックしてホールドしたときだけでなく、タップでセルを強調表示して点滅させたい...

11
mufc

私はまったく同じ問題を抱えていて、解決策は実際には上記に投稿されたものよりもはるかに簡単です。

ビューコントローラーで、collectionView.delaysContentTouches = falseを追加します。

そして、セル内の他のコードはそのままで問題ありませんでした:

class SlideOutMenuCells: UICollectionViewCell {

    //Setup code...

    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                backgroundColor = UIColor.darkGreen()
            } else {
                backgroundColor = UIColor.mainGreen()
            }
        }
    }
}

しかし、今では迷惑な遅延はなくなりました。

1
Kevin Renskers

これは強調表示の作業コードですUICollectionViewCellタップ(Swift 4)

ソリューション1

class StoreCollViewCell:UICollectionViewCell{

    override var isSelected: Bool {
        didSet {
            self.contentView.backgroundColor = isSelected ? UIColor.red : UIColor.clear
        }
    }
}

ソリューション2

UICollectionViewCellクラスで何もする必要はありません。

class StoreListViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {

    var previousSelected : IndexPath?
    var currentSelected : Int?

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "StoreCollViewCell", for: indexPath) as! StoreCollViewCell

        // To set the selected cell background color here
        if currentSelected != nil && currentSelected == indexPath.row
        {
            cell.backgroundColor = UIColor.green
        }else{
            cell.backgroundColor = UIColor.yellow
        }

        return cell     
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        // For remove previously selection 
        if previousSelected != nil{
            if let cell = collectionView.cellForItem(at: previousSelected!){
                cell.backgroundColor = UIColor.yellow
            }
        }
        currentSelected = indexPath.row
        previousSelected = indexPath

        // For reload the selected cell
        self.collVwStores.reloadItems(at: [indexPath]) 
    }
}

出力

enter image description here

enter image description here

8
Nikunj Kumbhani

UILongPressGestureRecognizerを使用して選択を示すことができます。

_override func awakeFromNib() {
    super.awakeFromNib()

    let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
    tapGesture.minimumPressDuration = 0
    tapGesture.cancelsTouchesInView = false
    addGestureRecognizer(tapGesture)
}

@objc func didTap(recognizer: UILongPressGestureRecognizer) {
    if recognizer.state == .began {
        backgroundColor = .red
    }
    if recognizer.state == .ended {
        backgroundColor = .green
    }
}
_

または、extensionUICollectionViewCell

_extension UICollectionViewCell {
func makeSelectionIndicatable() {
    let tapGesture = UILongPressGestureRecognizer(target: self, action: #selector(didTap(recognizer:)))
    tapGesture.minimumPressDuration = 0
    tapGesture.cancelsTouchesInView = false
    addGestureRecognizer(tapGesture)
}

@objc private func didTap(recognizer: UILongPressGestureRecognizer) {
    if recognizer.state == .began {
        backgroundColor = .red
    }
    if recognizer.state == .ended {
        backgroundColor = .green
    }
}
_

}

その後、awakeFromNib()メソッドのセルの場合、makeSelectionIndicatable()を追加するだけです

2
rubik

次のようなセルのコンテンツビューの場合、色を変更することでこれを行うことができます。

class SlideOutMenuCells: UICollectionViewCell {

override var isSelected: Bool {
    didSet {
        self.contentView.backgroundColor = isSelected ? OLTheme.Colors.Selected_Voucher_Color : UIColor.clear
    }
} 
}
0
Adnan Munir