UICollectionViewCell с пользовательским UICollectionViewLayout для создания анимации параллакса только на одном подпредставлении - PullRequest
1 голос
/ 05 марта 2019

Вдохновленный этим учебником [Учебник по пользовательскому UICollectionViewLayout с параллаксом] [1]

[1]: https://www.raywenderlich.com/527-custom-uicollectionviewlayout-tutorial-with-parallax Я создал свою собственную версию представления коллекции параллакса.

Я создаю анимацию параллакса и эффект отскока для заголовка и нижнего колонтитула с помощью этой логики:

 private func updateSupplementaryViews(_ type: Element, attributes: CustomLayoutAttributes, collectionView: UICollectionView, indexPath: IndexPath) {
    if type == .header,
        settings.isHeaderStretchy {

        var delta: CGFloat = 0.0
        let updatedHeight = min(
            collectionView.frame.height + headerSize.height,
            max(headerSize.height , headerSize.height - contentOffset.y))

        let scaleFactor = updatedHeight / headerSize.height

        if contentOffset.y <= 0{
            delta = (updatedHeight - headerSize.height) / 2

        }else{
            delta = (headerSize.height - updatedHeight - abs(contentOffset.y))
        }

        let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)
        let translation = CGAffineTransform(translationX: 0, y: min(contentOffset.y, headerSize.height) + delta)
        attributes.transform = scale.concatenating(translation)

    }else if type == .footer,
        settings.isFooterStretchy {

        var updatedHeight: CGFloat = 0.0
        if collectionView.contentSize.height - contentOffset.y < UIScreen.main.bounds.height {
            updatedHeight = min(
                collectionView.frame.height + footerSize.height,
                max(footerSize.height, abs(((collectionView.contentSize.height - (footerSize.width + deviationDeviceSize)) - UIScreen.main.bounds.height) - contentOffset.y)))
        }else{
            updatedHeight = min(
                collectionView.frame.height + footerSize.height,
                max(headerSize.height, headerSize.height - contentOffset.y))
        }

        let scaleFactor = updatedHeight / footerSize.height
        let delta = ((updatedHeight - footerSize.height) / 2) - footerSize.height
        let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)
        let translation = CGAffineTransform(translationX: 0, y: min(contentOffset.y, footerSize.height) + delta )
        attributes.transform = scale.concatenating(translation)
    }
}

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

1 Ответ

0 голосов
/ 14 марта 2019
  1. Что вы установили как customAttributes для Element.footer?
  2. Какой размер нижнего колонтитула вы устанавливаете?

Вы включили несколько реализаций вокруг нижнего колонтитула в свой проект, который нам не виден? Хотите поделиться всем файлом?

...