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()
}
}
}
}
どちらのソリューションも実際には意図したとおりに機能しません。私はここでこれに対処しようとするいくつかの投稿を見てきましたが、実際に機能する解決策を持つものを見つけていません。ユーザーがセルをクリックしてホールドしたときだけでなく、タップでセルを強調表示して点滅させたい...
私はまったく同じ問題を抱えていて、解決策は実際には上記に投稿されたものよりもはるかに簡単です。
ビューコントローラーで、collectionView.delaysContentTouches = false
を追加します。
そして、セル内の他のコードはそのままで問題ありませんでした:
class SlideOutMenuCells: UICollectionViewCell {
//Setup code...
override var isHighlighted: Bool {
didSet {
if self.isHighlighted {
backgroundColor = UIColor.darkGreen()
} else {
backgroundColor = UIColor.mainGreen()
}
}
}
}
しかし、今では迷惑な遅延はなくなりました。
これは強調表示の作業コードです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])
}
}
出力
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
}
}
_
または、extension
をUICollectionViewCell
に
_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()
を追加するだけです
次のようなセルのコンテンツビューの場合、色を変更することでこれを行うことができます。
class SlideOutMenuCells: UICollectionViewCell {
override var isSelected: Bool {
didSet {
self.contentView.backgroundColor = isSelected ? OLTheme.Colors.Selected_Voucher_Color : UIColor.clear
}
}
}