Методы делегата UIScrollView, которые не вызываются, когда установлен UICollectionViewCompositionalLayout - PullRequest
0 голосов
/ 10 ноября 2019

В настоящее время у меня есть UICollectionView с использованием UICollectionViewCompositionalLayout. Я хотел бы анимировать некоторые виды в пределах текущих видимых ячеек, когда прокрутка / прокрутка останавливается.

К сожалению, кажется, что установка orthogonalScrollingBehavior в секции не на что-либо, кроме .none угона UICollectionView сопровождающих UIScrollView методов делегата.

Интересно, есть ли какой-нибудь текущий способ для этого? Чтобы получить режим пейджинга и UIScrollView делегат?

Макет установки

  enum Section {
    case main
  }

  override func awakeFromNib() {
    super.awakeFromNib()
    collectionView.collectionViewLayout = createLayout()
    collectionView.delegate = self
  }

  func configure() {
    snapshot.appendSections([.main])
    snapshot.appendItems(Array(0..<10))
    dataSource.apply(snapshot, animatingDifferences: false)
  }

 private func createLayout() -> UICollectionViewLayout {
    let leadingItem = NSCollectionLayoutItem(
      layoutSize: NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1.0),
        heightDimension: .fractionalHeight(1.0))
    )

    leadingItem.contentInsets = .zero

    let containerGroup = NSCollectionLayoutGroup.horizontal(
      layoutSize: NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1.0),
        heightDimension: .fractionalHeight(1.0)
      ),
      subitems: [leadingItem])

    let section = NSCollectionLayoutSection(group: containerGroup)
    section.orthogonalScrollingBehavior = .groupPaging // WOULD LIKE PAGING & UISCROLLVIEW TO ALSO BE FIRED

    let config = UICollectionViewCompositionalLayoutConfiguration()
    config.scrollDirection = .horizontal

    let layout = UICollectionViewCompositionalLayout(section: section, configuration: config)
    return layout
  }

UICollectionViewDelegate

extension SlidingCardView: UICollectionViewDelegate {

  func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    // THIS IS FIRED BUT UISCROLLVIEW METHODS NOT
  }

  func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    print(111)
  }


  func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    print("1111111")
  }
}

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Установка orthogonalScrollingBehavior в раздел, встраивает внутренний _UICollectionViewOrthogonalScrollerEmbeddedScrollView, который обрабатывает прокрутку в разделе. Это внутреннее представление прокрутки добавляется в качестве подпредставления к представлению вашей коллекции.

Когда вы устанавливаете себя как delegate для представления своей коллекции, вы должны получить обратные вызовы делегата для представления прокрутки ТОЛЬКО дляосновной вид коллекции, который прокручивает разделы, а не элементы в разделе. Поскольку внутренние scrollviews (которые также могут быть collectionViews, не уверены) являются совершенно разными экземплярами, и вы не устанавливаете себя в качестве делегата для них, вы не получаете их обратные вызовы.

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

, но если вам интересно, и вы хотите поэкспериментировать с этим, вы можете использовать этот «взломанный» класс collectionView:

import UIKit

final class OrtogonalScrollingCollectionView: UICollectionView {

    override var delegate: UICollectionViewDelegate? {
        get { super.delegate }
        set {
            super.delegate = newValue
            subviews.forEach { (view) in
                guard String(describing: type(of: view)) == "_UICollectionViewOrthogonalScrollerEmbeddedScrollView" else { return }
                guard let scrollView = view as? UIScrollView else { return }
                scrollView.delegate = newValue
            }
        }
    }
}

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

0 голосов
/ 11 ноября 2019

Для вызова методов делегата scrollView необходимо адаптировать протокол UIScrollViewDelegate и установить для делегата UIScrollView значение self

, т. Е. - scrollView.delegate = self

...