У меня есть представление коллекции в моем классе UIViewController, и я использую массив логических значений, чтобы увидеть, какие индексы раскрыты (см. Этот ответ) .
var isExpanded = [Bool]()
Поэтому, когда я нажимаюкнопка, я могу перезагрузить ячейку с:
@objc func topButtonTouched(indexPath: IndexPath) {
print(indexPath)
isExpanded[indexPath.row] = !isExpanded[indexPath.row]
UIView.animate(withDuration: 0.6, delay: 0.0, usingSpringWithDamping: 0.6, initialSpringVelocity: 1.0, options: UIView.AnimationOptions.transitionCurlUp, animations: {
self.listCollectionView.reloadItems(at: [indexPath])
}, completion: { success in
print("success")
})
}
Пока все хорошо.Однако проблема, с которой я сталкиваюсь, возникает при переупорядочении ячеек.Я не переупорядочиваюсь с beginInteractiveMovementForItem (), updateInteractiveMovementTargetPosition () и т. Д.
Я начал использовать эту функцию (из этого репозитория) ниже для создания анимации масштабирования (снимка ячейки) думал, что это также переупорядочит ячейки:
@objc func longPressRecognized(_ recognizer: UILongPressGestureRecognizer) {
let location = recognizer.location(in: collectionView)
let indexPath = collectionView.indexPathForItem(at: location)
switch recognizer.state {
case UIGestureRecognizer.State.began:
guard let indexPath = indexPath else { return }
let cell = cellForRow(at: indexPath)
snapshotView = cell.snapshotView(afterScreenUpdates: true)
collectionView.addSubview(snapshotView!)
cell.contentView.alpha = 0.0
UIView.animate(withDuration: 0.2, animations: {
self.snapshotView?.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
self.snapshotView?.alpha = 0.9
})
snapshotPanPoint = location
snapshotIndexPath = indexPath
case UIGestureRecognizer.State.changed:
guard let snapshotPanPoint = snapshotPanPoint else { return }
let translation = CGPoint(x: location.x - snapshotPanPoint.x, y: location.y - snapshotPanPoint.y)
snapshotView?.center.y += translation.y
self.snapshotPanPoint = location
guard let indexPath = indexPath else { return }
collectionView.moveItem(at: snapshotIndexPath!, to: indexPath)
snapshotIndexPath = indexPath
default:
guard let snapshotIndexPath = snapshotIndexPath else { return }
let cell = cellForRow(at: snapshotIndexPath)
UIView.animate(
withDuration: 0.2,
animations: {
self.snapshotView?.center = cell.center
self.snapshotView?.transform = CGAffineTransform.identity
self.snapshotView?.alpha = 1.0
},
completion: { finished in
cell.contentView.alpha = 1.0
self.snapshotView?.removeFromSuperview()
self.snapshotView = nil
})
self.snapshotIndexPath = nil
self.snapshotPanPoint = nil
}
}
Я попытался изменить массив isExpanded в секции .changed переключателя, но безуспешно.Я также попробовал этот ответ .
Gif моей проблемы :
![Gif Screen Shot](https://i.stack.imgur.com/2t32r.gif)
Редактировать: Раньше, когда у меня был один массив для bools, это было так:
@objc func topButtonTouched(indexPath: IndexPath) {
isExpanded[indexPath.item] = !isExpanded[indexPath.item]
и теперь с основным массивом объектов я пытаюсь сделать это:
@objc func topButtonTouched(indexPath: IndexPath) {
var names = mainData.map({ $0.isExpanded })
names[indexPath.row] = !names[indexPath.row]
а затем обновите indexpaths.