Animate CollectionViewCell после удаления элемента - PullRequest
0 голосов
/ 31 марта 2020

Для моего CollectionView у меня есть это animation внутри willDisplay:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

        // Add animations here
        let animation = AnimationFactory.makeMoveUpWithFade(rowHeight: cell.frame.height, duration: 0.5, delayFactor: 0.1)
        let animator = Animator(animation: animation)
        animator.animate(cell: cell, at: indexPath, in: collectionView)

}

Это , как работает анимация (я реализовал это для CollectionView), если Вам это нужно для получения дополнительной информации.

Probelm:

Внутри моего проекта пользователь может create и delete и item.

Прямо сейчас collectionView не анимируется после deleting, хотя я звоню reloadData:

extension MainViewController: DismissWishlistDelegate {

func dismissWishlistVC(dataArray: [Wishlist], dropDownArray: [DropDownOption]) {
    self.dataSourceArray = dataArray
    self.dropOptions = dropDownArray
    self.makeWishView.dropDownButton.dropView.tableView.reloadData()

    // reload the collection view
    theCollectionView.reloadData()
    theCollectionView.performBatchUpdates(nil, completion: nil)

}
}

Здесь я называю delegate внутри моего другого ViewController:

func deleteTapped(){

    let alertcontroller = UIAlertController(title: "Wishlist löschen", message: "Sicher, dass du diese Wishlist löschen möchtest?", preferredStyle: .alert)

    let deleteAction = UIAlertAction(title: "Löschen", style: .default) { (alert) in

        DataHandler.deleteWishlist(self.wishList.index)

        self.dataSourceArray.remove(at: self.currentWishListIDX)
        self.dropOptions.remove(at: self.currentWishListIDX)

        // change heroID so wishlist image doesnt animate
        self.wishlistImage.heroID = "delete"

        self.dismiss(animated: true, completion: nil)

        //  update datasource array in MainVC
        self.dismissWishlistDelegate?.dismissWishlistVC(dataArray: self.dataSourceArray, dropDownArray: self.dropOptions)

    }

    let cancelAction = UIAlertAction(title: "Abbrechen", style: .default) { (alert) in
        print("abbrechen")
    }


    alertcontroller.addAction(cancelAction)
    alertcontroller.addAction(deleteAction)

    self.present(alertcontroller, animated: true)
}

Когда creating анимация работает просто отлично. Вот так выглядит мой createDelegateFunction:

func createListTappedDelegate(listImage: UIImage, listImageIndex: Int, listName: String) {
    // append created list to data source array
    var textColor = UIColor.white
    if Constants.Wishlist.darkTextColorIndexes.contains(listImageIndex) {
        textColor = UIColor.darkGray
    }

    let newIndex = self.dataSourceArray.last!.index + 1

    self.dataSourceArray.append(Wishlist(name: listName, image: listImage, wishData: [Wish](), color: Constants.Wishlist.customColors[listImageIndex], textColor: textColor, index: newIndex))

    // append created list to drop down options
    self.dropOptions.append(DropDownOption(name: listName, image: listImage))

    // reload the collection view
    theCollectionView.reloadData()
    theCollectionView.performBatchUpdates(nil, completion: {
        (result) in
        // scroll to make newly added row visible (if needed)
        let i = self.theCollectionView.numberOfItems(inSection: 0) - 1
        let idx = IndexPath(item: i, section: 0)
        self.theCollectionView.scrollToItem(at: idx, at: .bottom, animated: true)

    })
}

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Я решил проблему, удалив performBatchUpdates ... Я не знаю, почему это работает сейчас и что именно performBatchUpdates делает, но работает, поэтому, если кто-то захочет мне это объяснить, не стесняйтесь: D

Последняя функция выглядит следующим образом:

func dismissWishlistVC(dataArray: [Wishlist], dropDownArray: [DropDownOption], shouldDeleteWithAnimation: Bool, indexToDelete: Int) {

    if shouldDeleteWithAnimation {

        self.shouldAnimateCells = true
        self.dataSourceArray.remove(at: self.currentWishListIDX)
        self.dropOptions.remove(at: self.currentWishListIDX)

        // reload the collection view
        theCollectionView.reloadData()


    } else {

        self.shouldAnimateCells = false
        self.dataSourceArray = dataArray
        self.dropOptions = dropDownArray

        // reload the collection view
        theCollectionView.reloadData()
        theCollectionView.performBatchUpdates(nil, completion: nil)
    }

    self.makeWishView.dropDownButton.dropView.tableView.reloadData()

}
0 голосов
/ 31 марта 2020

Анимация вставки и удаления IUCollectionView элементов выполняется правильно с использованием finalLayoutAttributesForDisappearingItem(at:) и initialLayoutAttributesForAppearingItem (at:)

Небольшой отрывок из документации Apple по finalLayoutAttributesForDisappearingItem(at:)

Этот метод вызывается после метода prepare (forCollectionViewUpdates :) и перед методом finalizeCollectionViewUpdates () для любых элементов, которые собираются удалить. Ваша реализация должна вернуть информацию макета, которая описывает окончательную позицию и состояние элемента. Представление коллекции использует эту информацию в качестве конечной точки для любой анимации. (Начальной точкой анимации является текущее местоположение элемента.) Если вы вернете nil, объект макета использует одинаковые атрибуты для начальной и конечной точек анимации.

...