我有一个自定义的收藏视图,通常它绘制得很好,滚动很好也很流畅,总体来说还可以,
内置了使用
移动项目的功能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
}
}
关于在拖动项目和页面滚动时会导致我的视图“跳动”的任何想法。
如果我只是在屏幕上移动项目(不滚动),那么效果很好
我已经检查了“准备”中的每个输出,并且从来没有偏移量或任何东西,它可以平滑绘制
谢谢
答案 0 :(得分:1)
您应该使用collectionView
而不是longGestureObject
。因此,代替:
gridLayout.updateInteractiveMovementTargetPosition(
longGestureObject.location(in: longGestureObject.view!)
)
使用:
gridLayout.updateInteractiveMovementTargetPosition(
longGestureObject.location(in: collectionView)
)