Как сохранить высоту UICollectionviewcell при расширении? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть представление коллекции в моем классе 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

Редактировать: Раньше, когда у меня был один массив для 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.

1 Ответ

0 голосов
/ 06 декабря 2018

Как правило, использование нескольких источников данных в одном UITableView приносит неудачу , когда вы делаете это при планировании изменения порядка элементов- это просто самоубийство:)

Поэтому я бы порекомендовал вам сменить источник данных с двух массивов - [String] и [Bool] на один [ListItem] -

(Здесь яm, используя class, но вы можете использовать struct, просто имейте в виду, классы передаются по эталону , в то время как структуры передаются по значение )

class ListItem{
    var title: String
    var isExpended: Bool

    init(title: String, isExpended: Bool){
        self.title = title
        self.isExpended = isExpended
    }
}

Затем, когда пользователь завершит переупорядочение, вам нужно зафиксировать эти изменения в списке - удаление и вставка элемента в другой индекс выполнят эту работу.

...