使用selectedBackgroundView显示突出显示的状态

时间:2015-01-05 03:43:24

标签: ios swift uibutton uicollectionview uicollectionviewcell

想象一下你有一个UICollectionView的场景,并且在每个单元格中你想要一个按钮填充整个单元格,这样你就可以响应各种触摸事件来处理高亮外观。例如,当用户触摸按钮时,您想要更改按钮的背景颜色,然后在拖出或取消触摸等时将其还原。现在想象一下这样的情况,而不是更改按钮的背景颜色您想要更改单元格backgroundViewUIButton没有背景视图,只有backgroundColorbackgroundImage

我有一个解决方案,但我想知道它是否更干净,如果不推荐这种方法。触摸按钮后,我会遍历其superview,直到我获得UICollectionViewCell,然后将其selected属性设置为true。在cellForItemAtIndexPath我根据需要设置了selectedBackgroundView。这会获得所需的行为,但是使用所选状态来指示突出显示状态并以这种方式管理它是不合适的吗?什么会更好?

我可以在触摸按钮时获取UICollectionViewCell然后更改其backgroundView属性,而不是在创建每个单元格时执行此操作,则无需更改selected值。但这仍然不是一个很好的解决方案。

2 个答案:

答案 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:注册该单元格。


添加:清洁版。在自定义集合视图单元子类中,指定backgroundViewselectedBackgroundView

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}}。