UICollectionView
является подклассом UIScrollView
, поэтому
- Сначала установите делегат collectionView на ViewController
:
collectionView.delegate = self
- Теперь установите ViewController на
UIScrollViewDelegate
Теперь реализуем scrollViewDidScroll
как:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
}
В приведенном выше фрагменте кода мы получим видимый элемент для вашего collectionView
.
Теперь вы можете использовать это visibleIndexPath
для обновления внешнего изображения.
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
outerImageView.image = UIImage(named: outerImageNames[visibleIndexPath.row])
}
Здесь outerImageView
относится к вашему внешнему изображению, а outerImageNames
представляет собой массив строк с именами ваших изображений .
Я предположил, что изображения для внешнего UIImageView
присутствуют в вашем комплекте. Но если изображения поступают из какого-то другого источника, то логику настройки изображения можно настроить. В случае изображений, поступающих из асинхронного API (FileSystem или Network call), я настоятельно рекомендую использовать интенсивное кэширование (в этом случае рассмотрите возможность использования KingFisher или SDWebImage ) ,