如何在collectionview中添加声音反馈(如pickerview)?

时间:2019-05-21 13:26:42

标签: ios swift uicollectionview haptic-feedback

嗨,我正在尝试在collectionview项目之间滚动时添加反馈。我应该在哪里添加代码以在collectionview委托中提供反馈。如果我添加willDisplay然后添加最初将显示的单元格将调用反馈,这不是很好。我只需要在用户滚动并选择一个项目时提供反馈。

2 个答案:

答案 0 :(得分:2)

假设您仅沿一个方向(如垂直方向)滚动并且所有行的行都具有相同的高度,则可以使用scrollViewDidScroll(_:)来检测UIPickerView之类的选择。

class ViewController {
    var lastOffsetWithSound: CGFloat = 0
}

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if let flowLayout = ((scrollView as? UICollectionView)?.collectionViewLayout as? UICollectionViewFlowLayout) {
            let lineHeight = flowLayout.itemSize.height + flowLayout.minimumLineSpacing
            let offset = scrollView.contentOffset.y
            let roundedOffset = offset - offset.truncatingRemainder(dividingBy: lineHeight)
            if abs(lastOffsetWithSound - roundedOffset) > lineHeight {
                lastOffsetWithSound = roundedOffset
                print("play sound feedback here")
            }
        }
    }
}

请记住,UICollectionViewDelegateFlowLayout继承了UICollectionViewDelegate,而UIScrollViewDelegate本身也继承了scrollViewDidScroll,因此您可以在其中的任何一个中声明{{1}}。

答案 1 :(得分:0)

您可以将其添加到视图控制器方法中

touchesBegan(_:with:)
touchesMoved(_:with:)

这样,只要用户在任何地方与您的视图控制器进行交互,您都可以提供反馈,并且反馈仅限于用户交互,而在您以编程方式添加单元格或在表视图上调用update时则不会。

如果您的控制器中还包含其他UI组件,并且您希望将反馈限制为您的集合视图而不是其他组件,则可以使用这些方法检查该视图。

let touch: UITouch = touches.first as! UITouch
if (touch.view == collectionView){
    println("This is your CollectionView")
}else{
    println("This is not your CollectionView")
}

别忘了调用super来使系统有机会对这些方法做出反应。 希望这会有所帮助。