Swift中点击顶部评分星如何滚动到同屏的评论CollectionView
问题描述
点击页面顶部的评分星按钮时,需要将屏幕滚动至同一页面内的评论UICollectionView位置,但当前实现会直接滚动到屏幕最底部,无法精准定位目标视图。现有核心代码如下:
按钮点击事件代码
@IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var reviewCollectionView: UICollectionView! @IBAction func reviewStarsTapped(_ sender: UIButton) { scrollView.setContentOffset(CGPoint(x: 0, y: scrollView.contentSize.height), animated: true) }
UICollectionView配置代码
let layout3 = UICollectionViewFlowLayout() override func viewDidLoad() { layout3.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) layout3.minimumInteritemSpacing = 0 layout3.minimumLineSpacing = 0 layout3.scrollDirection = .horizontal layout3.itemSize = CGSize(width: reviewCollectionView.bounds.width, height: reviewCollectionView.bounds.height) reviewCollectionView.collectionViewLayout = layout3 reviewCollectionView.isPagingEnabled = true reviewCollectionView.backgroundColor = .clear } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() layout3.itemSize = CGSize(width: reviewCollectionView.bounds.width, height: reviewCollectionView.bounds.height) }
解决方法
当前代码直接将scrollView的contentOffset设置为contentSize.height,这会强制滚动到滚动视图的最底部。要精准定位到reviewCollectionView,需要计算该视图在scrollView坐标系中的垂直起始位置,再设置contentOffset。
修改后的按钮点击事件
@IBAction func reviewStarsTapped(_ sender: UIButton) { // 确保视图布局已完成,避免frame计算错误 view.layoutIfNeeded() // 获取collectionView在scrollView内的Y轴起始坐标 let targetOffsetY = reviewCollectionView.frame.origin.y // 滚动到目标位置 scrollView.setContentOffset(CGPoint(x: 0, y: targetOffsetY), animated: true) }
额外注意事项
- 如果
scrollView设置了contentInset(比如适配导航栏、状态栏),需要将contentInset.top加到targetOffsetY中,修正偏移量:let targetOffsetY = reviewCollectionView.frame.origin.y + scrollView.contentInset.top - 若
reviewCollectionView的位置会随动态内容变化(比如上方视图高度动态调整),建议在viewDidLayoutSubviews中提前缓存目标Y值,避免点击时重复计算可能出现的误差。
内容的提问来源于stack exchange,提问作者swift doubts
相关产品推荐
相关产品推荐

