滚动并使用updateInteractiveMovementTargetPosition时CollectionView跳跃

时间:2018-08-20 12:10:32

标签: uicollectionview

我有一个自定义的收藏视图,通常它绘制得很好,滚动很好也很流畅,总体来说还可以,

内置了使用

移动项目的功能

beginInteractiveMovementForItem和updateInteractiveMovementTargetPosition

要激活beginInteractiveMovementForItem,我将其附加到长按手势上。

@IBAction func longGestureAction(_ sender: Any) { 
        switch longGestureObject.state {

        case .began:
             gridLayout.beginInteractiveMovementForItem(at: selectedIndexPath)


        case .changed:
             gridLayout.updateInteractiveMovementTargetPosition(longGestureObject.location(in: longGestureObject.view!))

        case .ended:
            gridLayout.endInteractiveMovement()

        default:
            gridLayout.cancelInteractiveMovement()
        }
}

我遇到的问题是,当我拖动并滚动视图时,视图跳转,几乎就像有一个顶部偏移已被应用并被移走/被应用-被移走了等等

我有自己的布局课程

public class ChartGridLayout: UICollectionViewLayout {
    fileprivate var cache = [[UICollectionViewLayoutAttributes]]()

    override public func prepare() {

    cache.removeAll()

    // Calcaulate screen position for object
    // Add it to the cache
    }

    override public var collectionViewContentSize: CGSize {
        return CGSize(width: calculatedWidth, height: calculatedHeight)
    }

    override public func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

        var visibleLayoutAttributes = [UICollectionViewLayoutAttributes]()

        // Loop through the cache and look for items in the rect
        for attributes in cache {
            for att in attributes {
            if att.frame.intersects(rect) {
                visibleLayoutAttributes.append(att)
            }
            }
        }
        return visibleLayoutAttributes
    }

    override public func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        return cache[indexPath.section][indexPath.row]
    }

    override public func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return false
    }
}

关于在拖动项目和页面滚动时会导致我的视​​图“跳动”的任何想法。

如果我只是在屏幕上移动项目(不滚动),那么效果很好

我已经检查了“准备”中的每个输出,并且从来没有偏移量或任何东西,它可以平滑绘制

谢谢

1 个答案:

答案 0 :(得分:1)

您应该使用collectionView而不是longGestureObject。因此,代替:

gridLayout.updateInteractiveMovementTargetPosition(
    longGestureObject.location(in: longGestureObject.view!)
)

使用:

gridLayout.updateInteractiveMovementTargetPosition(
    longGestureObject.location(in: collectionView)
)