Прокрутка CollectionView для недавно вставленного элемента - PullRequest
0 голосов
/ 11 марта 2019

У меня есть CollectionView, управляемый NSFetchedResultsController.

CollectionViewLayout - это горизонтальный «карусельный» макет ячеек, упорядоченный по возрастанию имен.

Новые элементы вставляются с таможенной анимацией.

 func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {

if type == NSFetchedResultsChangeType.Insert {
    println("Insert Object: \(newIndexPath)")

   UIView.animate(withDuration: 1.0, delay: 0.0, options: .curveEaseOut, animations: {
       self.collectionView?.insertItems(at: [newIndexPath])
   }, completion: { finished in
       self.collectionView?.scrollToItem(at: newIndexPath, at: .centeredHorizontally, animated: true)
})
    )
...

Это работает, но анимация немного глючная, и прокрутка происходит одновременно.

Я хотел бы выделить элемент, затем вставить его с пользовательской анимацией, но если я прокручиваюдо элемента перед его вставкой вылетает приложение.

Как правильно поступить здесь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Первое, что я бы попробовал, это заменить animate(withDuration:delay:options:animations:completion:) на performBatchUpdates(_:completion:)

func controller(controller: NSFetchedResultsController,
                didChangeObject anObject: AnyObject,
                atIndexPath indexPath: NSIndexPath?,
                forChangeType type: NSFetchedResultsChangeType,
                newIndexPath: NSIndexPath?)
{

    if type == NSFetchedResultsChangeType.Insert {
        println("Insert Object: \(newIndexPath)")

    self.collectionView?.performBatchUpdates({
        self.collectionView?.insertItems(at: [newIndexPath])
    }, completion: { finished in
        self.collectionView?.scrollToItem(at: newIndexPath, at: .centeredHorizontally, animated: true)
    })
    …
}

Если это все еще вызывает проблемы, вы можете вызвать прокрутку в следующем цикле выполнения.

func controller(controller: NSFetchedResultsController,
                didChangeObject anObject: AnyObject,
                atIndexPath indexPath: NSIndexPath?,
                forChangeType type: NSFetchedResultsChangeType,
                newIndexPath: NSIndexPath?)
{

    if type == NSFetchedResultsChangeType.Insert {
        println("Insert Object: \(newIndexPath)")

    self.collectionView?.performBatchUpdates({
        self.collectionView?.insertItems(at: [newIndexPath])
    }, completion: { finished in
        DispatchQueue.main.async { // Defer to next runlop.
            self.collectionView?.scrollToItem(at: newIndexPath, at: .centeredHorizontally, animated: true)
        }
    })
    …
}

Наконец, вы можете попробовать только анимацию для прокрутки части.

func controller(controller: NSFetchedResultsController,
                didChangeObject anObject: AnyObject,
                atIndexPath indexPath: NSIndexPath?,
                forChangeType type: NSFetchedResultsChangeType,
                newIndexPath: NSIndexPath?)
{

    if type == NSFetchedResultsChangeType.Insert {
        println("Insert Object: \(newIndexPath)")

    self.collectionView?.reloadItems(at: [newIndexPath]) // reload without animating.

    DispatchQueue.main.async { // Defer to next runlop.
        self.collectionView?.scrollToItem(at: newIndexPath, at: .centeredHorizontally, animated: true)
    }
    …
}
0 голосов
/ 11 марта 2019

Посмотрев на эту функцию, я могу представить, что сбой, который вы видите, заключается в прокрутке CollectionView вперед, а затем резиновой полосе / «телепортации» назад.

Я думаю, что это может произойти, потому что вы пытаетесь запустить дваанимации одновременно.Ваша первая анимация, UIView.animate (), анимирует прокрутку к новому вставленному элементу;однако, когда вы вызываете collectionView? .scrollToItem (), вы также анимируете это (см. ниже)

self.collectionView?.scrollToItem(..., animated: true) <--

Возможно, поэтому оно не работает;Вы пытаетесь оживить анимацию.Попробуйте установить для animated значение false и посмотрите, исправит ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...