iOS 13 Методы делегата CollectionView не вызывают - PullRequest
0 голосов
/ 10 марта 2020

У нас есть этот код в нашем приложении, который работает нормально для всех версий iOS, кроме iOS 13. В iOS 12 и ниже методы-делегаты, такие как cellForItemAt и willDisplayCell, вызываются без проблем, однако в iOS 13 вызывается только numberOfSections, а другие методы не вызываются.

Я искал изменения API в iOS 13, которые могут привести к этой проблеме, и не нашел ни одного. Я что-то упускаю, чтобы он работал в iOS 13.

Вот мой код:

class PhotoBrowserView: UIView, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate, UICollectionViewDataSource, UIScrollViewDelegate {

    var photos: [PhotoURL] = [PhotoURL]() {
        didSet {
            photoCollectionView.reloadData()
        }
    }


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return self.bounds.size
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath)
        return cell
    }

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

        let cell = cell as! SimplePhotoCell
        cell.thumbnailButton.isUserInteractionEnabled = false
        cell.thumbnailPath = photos[indexPath.item].photoURL.absoluteString
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return photos.count
    }

}

Вот как я называю фотографии:

class StoryView: ShowPageView, UIScrollViewDelegate {

    private let photosView: PhotoBrowserView = {
       return PhotoBrowserView()
    }()


    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if self.traitCollection.horizontalSizeClass == .compact, viewModel.story.portraitPhotos.count > 0 {
            photosView.photos = viewModel.story.portraitPhotos
        } else {
            photosView.photos = viewModel.story.landscapePhotos
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

В предыдущих версиях iOS traitCollectionDidChange метод вызывался при добавлении представления в иерархию представления, а в iOS 13 UIKit устанавливает черты представления при его создании до добавления представления в представление. иерархия. в результате traitCollectionDidChange не вызывается, и ваши фотографии не установлены. Когда ваши фотографии не установлены, ваш collectionView не перезагружается.

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

Пожалуйста, обратитесь к Keith на UserYourLoaf для более подробной информации. Я поделюсь его ответами и добавлю один из своих.

Как уже отмечалось, в iOS 13 traitCollectionDidChange не вызывается, когда представление добавляется в иерархию представления. Он будет вызываться при последующих поворотах устройства. До iOS 13 traitCollectionDidChange вызывался, когда представление было добавлено в иерархию представления.

Это изменение в iOS 13 приводило к выравниванию всех элементов управления влево, когда представление впервые отображается перед любым севообороты. Они были отцентрированы до iOS 13.

Исправьте ваш код одним из следующих способов:

  1. Вызовите методы установки ваших свойств в viewDidLoad (в основном, скопируйте соответствующие части тело вашего traitCollectionDidChange для нового метода, который затем можно вызывать как из viewDidLoad, так и из traitCollectionDidChange.

  2. Следуйте указаниям Apple, чтобы добавить вызовы установки параметров одного из этих методов:

    UIViewController.viewWillLayoutSubviews ()

    UIView.layoutSubviews ()

    UIViewController.viewDidLayoutSubviews ()

  3. Как последняя строка в вашем методе viewDidLo вызовите существующий метод, передав ноль следующим образом:

    viewDidLoad () {... traitCollectionDidChange (nil)}

Рассмотрите возможность документирования, почему вы отклоняетесь от iOS версий. В противном случае кто-то придет и удалит ваше дополнение, которое кажется излишним при работе со старыми iOS версиями. Возможно, вы захотите создать свое Техническая задолженность за это изменение похожа на эту:

// TODO: When I quit supporting pre iOS 13, this conditional can be removed
if #available(iOS 13, *) {
   <whatever solution you chose above>
}
...