Ячейки UICollectionview исчезают после инициирования интерактивного движения и изменяют порядок с пользовательским макетом

У меня есть UICollectionview с пользовательским макетом в качестве подвида UIViewcontroller, Я хочу перетащить свои ячейки и сделать так, чтобы представление коллекции переупорядочивало ячейки, когда перетаскиваемая ячейка перемещается в границы не перетаскиваемой ячейки. Эта функциональность предоставляется, когда вы используете представление коллекции. Однако, как только я добавляю свой собственный макет, ячейки начинают исчезать после начала интерактивного движения.

Вот как я настроил свой макет customFlow:

private var frames = [CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0),//0
                      CGRect(x: 40.0, y: 0.0, width: 40.0, height: 40.0),//1
                      CGRect(x: 80.0, y: 0.0, width: 40.0, height: 40.0),//2
                      CGRect(x: 100.0, y: 0.0, width: 40.0, height: 40.0),//3
                      CGRect(x: 120.0, y: 0.0, width: 40.0, height: 40.0)]//4

private var cache = [NSIndexPath:UICollectionViewLayoutAttributes]()

override func prepareLayout() {
    super.prepareLayout()
    for item in 0 ..< collectionView!.numberOfItemsInSection(0){
        let indexPath = NSIndexPath(forItem: item, inSection: 0)
        let attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)

        attributes.frame = frames[item]
        cache[indexPath] = attributes
    }


}


override func collectionViewContentSize() -> CGSize {
    return UIScreen.mainScreen().bounds.size
}

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    var layoutAttributes = [UICollectionViewLayoutAttributes]()
    for attributes in cache.values {
        if CGRectIntersectsRect(attributes.frame, rect) {
            layoutAttributes.append(attributes)
        }
    }
    return layoutAttributes

}

override func layoutAttributesForInteractivelyMovingItemAtIndexPath(indexPath: NSIndexPath, withTargetPosition position: CGPoint) -> UICollectionViewLayoutAttributes {
    let attribute = cache[indexPath]
    attribute!.center = position
    return attribute!
   }

}

Вот как я начинаю интерактивное движение:

func handleLongPressForCollection(gesture: UILongPressGestureRecognizer){
    switch(gesture.state) {
    case UIGestureRecognizerState.Began:
        guard let selectedIndexPath = self.CollectionView.indexPathForItemAtPoint(gesture.locationInView(self.collectionView)) else {
            break
        }
        CollectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath)
    case UIGestureRecognizerState.Changed:
        collectionView.updateInteractiveMovementTargetPosition(gesture.locationInView(CollectionView))
    case UIGestureRecognizerState.Ended:
        collectionView.endInteractiveMovement()
    default:
        collectionView.cancelInteractiveMovement()
        break
    }
}

Я не понимаю invalidatelayout отлично. Я думаю, что мне нужно, чтобы решить эту проблему? Я пытался переопределить функцию invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPathsно я все еще получаю те же результаты.

1 ответ

У меня была такая же проблема, и выяснилось, что причина в том, что я не вызывал родителя в переопределенных функциях. Из вашего кода я вижу, что вы не получаете текущие атрибуты макета от родителя в layoutAttributesForElementsInRect функция. Вы должны сделать это в первой строке этого метода: var layoutAttributes = super.layoutAttributesForElements(in: rect)

Другие вопросы по тегам