滚动时放大UICollectionView实现视差效果的问题求助
UICollectionView滚动时实现顶部图片视差放大效果
问题概述
我想要实现一个视差效果:当用户向下滚动页面时,位于屏幕顶部的UICollectionView(包含带UIImageView的Cell)能随滚动动作放大。项目里涉及三个核心控制器:
- 带Storyboard的
PhotoGalleryViewController:内部包含UICollectionView和图片Cell - 无Storyboard的
ListingDetailContentViewController:作为子控制器被嵌入到ListingDetailViewController中 - 带Storyboard的
ListingDetailViewController:通过代码将ListingDetailContentViewController添加为子控制器并放入视图层级
ListingDetailContentViewController基于AloeStackViewController(UIScrollView的子类),我把PhotoGalleryViewController的视图添加到了它的stackView里,还设置了UIScrollView代理来监听滚动事件,尝试通过调整UICollectionView的高度实现效果,但没有成功。
我尝试过的实现代码
在ListingDetailContentViewController中编写了以下逻辑:
class ListingDetailContentViewController: AloeStackViewController, PhotoGalleryViewControllerDelegate, UIScrollViewDelegate { private var actualFrame: CGFloat = 0 private var photoGalleryViewController: PhotoGalleryViewController? // MARK: - Private functions private func setupView(ad: Ad) { // 加载图片画廊 if let photos = ad.photos { photoGalleryViewController = UIStoryboard(name: "Listing", bundle: nil).instantiateViewController(withIdentifier: "PhotoGalleryViewController") as? PhotoGalleryViewController let photoView = photoGalleryViewController.view! stackView.addRow(photoView) stackView.setInset(forRow: photoView, inset: .zero) photoGalleryViewController?.photos = photos photoGalleryViewController?.ad = ad photoGalleryViewController?.delegate = self actualFrame = photoGalleryViewController?.collectionView.frame.height ?? 0 } // 其他视图设置逻辑 } func scrollViewDidScroll(_ scrollView: UIScrollView) { let offsetY = scrollView.contentOffset.y if offsetY < 0 { photoGalleryViewController?.collectionView.frame.size.height += actualFrame - offsetY photoGalleryViewController?.view.frame.size.height += actualFrame - offsetY self.loadViewIfNeeded() } else { photoGalleryViewController?.collectionView.frame.size.height = actualFrame photoGalleryViewController?.view.frame.size.height = actualFrame self.loadViewIfNeeded() } } }
最终解决方案
经过尝试,我通过ParallaxHeader库顺利实现了需求,操作步骤很简单:
- 通过CocoaPods引入ParallaxHeader库
- 按照库的官方配置教程,将顶部的
PhotoGalleryViewController视图设置为视差头部,无需手动处理滚动偏移量和高度调整逻辑,就能自动实现滚动时的图片放大视差效果。
内容的提问来源于stack exchange,提问作者Muhammad Danish Qureshi
相关产品推荐
相关产品推荐

