想象一下你有一个UICollectionView
的场景,并且在每个单元格中你想要一个按钮填充整个单元格,这样你就可以响应各种触摸事件来处理高亮外观。例如,当用户触摸按钮时,您想要更改按钮的背景颜色,然后在拖出或取消触摸等时将其还原。现在想象一下这样的情况,而不是更改按钮的背景颜色您想要更改单元格backgroundView
。 UIButton
没有背景视图,只有backgroundColor
或backgroundImage
。
我有一个解决方案,但我想知道它是否更干净,如果不推荐这种方法。触摸按钮后,我会遍历其superview
,直到我获得UICollectionViewCell
,然后将其selected
属性设置为true
。在cellForItemAtIndexPath
我根据需要设置了selectedBackgroundView
。这会获得所需的行为,但是使用所选状态来指示突出显示状态并以这种方式管理它是不合适的吗?什么会更好?
我可以在触摸按钮时获取UICollectionViewCell
然后更改其backgroundView
属性,而不是在创建每个单元格时执行此操作,则无需更改selected
值。但这仍然不是一个很好的解决方案。
答案 0 :(得分:4)
您不需要在集合视图单元格内部使用按钮,只需在按下时设置其高亮颜色即可。只需将您的单元格selectedBackgroundView
设置为与您的单元格具有相同宽度和高度的视图,并为该视图提供您要突出显示该单元格的backgroundColor
。
我做的(脏)实现是这样的:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CELL", forIndexPath: indexPath) as UICollectionViewCell
cell.selectedBackgroundView = {
let bgview = UIView(frame: CGRectMake(0, 0, cell.frame.size.width, cell.frame.size.height))
bgview.backgroundColor = UIColor.redColor()
return bgview
}()
return cell
}
然后,只需取消选择didSelectItemAtIndexPath
中的单元格即可。 "持有压低"将自动为您处理,取消选择动画将仅在用户抬起手指时触发。
我认为这很脏,因为每次单元格出列时都要设置selectedBackgroundView
以便在cellForItemAtIndexPath:
中重复使用。我要做的是创建一个UICollectionViewCell
子类,从那里设置其selectedBackgroundView
,并在集合视图上使用registerNib:
或registerClass:
注册该单元格。
添加:清洁版。在自定义集合视图单元子类中,指定backgroundView
和selectedBackgroundView
:
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundView = {
let view = UIView()
view.backgroundColor = UIColor.yellowColor()
return view
}()
self.selectedBackgroundView = {
let view = UIView()
view.backgroundColor = UIColor.redColor()
return view
}()
}
视图中的相关方法控件,集合视图数据源和委托:
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView.registerClass(NSClassFromString("test.CustomCollectionViewCell"), forCellWithReuseIdentifier: "CELL")
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CELL", forIndexPath: indexPath) as UICollectionViewCell
return cell
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
collectionView.deselectItemAtIndexPath(indexPath, animated: true)
}
答案 1 :(得分:0)
我找到了一个很好的清洁解决方案。 UICollectionViewCell
已经有一个突出显示的状态,可以自动跟踪发生的各种触摸事件。但是没有highlightedBackgroundView
就像selectedBackgroundView
一样,但您仍然可以利用突出显示的状态来修改突出显示和取消突出显示时的单元格外观。因此,无需在每个单元格中使用UIButton
- UILabel
就可以了。
只需实施几个UICollectionViewDelegate
方法:collectionView:didHighlightItemAtIndexPath:
和collectionView:didUnhighlightItemAtIndexPath:
。当backgroundView
属性突出显示时更改,然后在nil
未突出显示时将其设置回{{1}}。