0

嗨,我正在尝试在滚动浏览 collectionview 项目时添加反馈。我应该在哪里添加代码以在 collectionview 代表中进行反馈。如果我添加 willDisplay 然后添加最初将显示的单元格将调用不好的反馈。只有当用户滚动并选择一个项目时,我才需要提供反馈。

4

2 回答 2

3

假设您只在一个方向(如垂直)滚动并且所有项目行具有相同的高度,您可以使用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在其中任何一个中声明。

于 2019-05-21T14:45:49.127 回答
0

您可以在视图控制器方法中添加它

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

因此,每当用户在任何地方与您的视图控制器交互时,您都可以提供反馈,并且它仅限于用户交互,而不是当您以编程方式添加单元格或在表格视图上调用更新时。

如果您的控制器中还有其他 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 让系统有机会对这些方法做出反应。希望这可以帮助。

于 2019-05-21T14:41:50.060 回答