无法将CGPoint赋值给CGFloat:UICollectionView滚动定位问题求助
修复UICollectionView滚动自动定位的两个代码错误
我来帮你搞定这两个Swift代码里的问题,咱们先逐个拆解错误原因,再给出修正后的完整代码:
错误1:CGFloat类型没有成员'x'
你之前的代码里,var offSet = targetContentOffSet.pointee.x 这一行已经把CGPoint的x值单独取出来赋值给了offSet,所以offSet是CGFloat类型,不是CGPoint,自然没有.x成员。计算index的时候直接用offSet就行,不用画蛇添足加.x。
错误2:无法将CGPoint类型值赋值给CGFloat类型
你后面试图把一个CGPoint对象赋值给offSet,但offSet一开始被定义成了CGFloat,类型完全不匹配。这里要么把offSet的类型改成CGPoint,要么重新定义一个CGPoint类型的变量来存储最终的目标偏移量。
修正后的完整代码
extension HomeViewController : UIScrollViewDelegate { func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset targetContentOffSet: UnsafeMutablePointer<CGPoint>) { // 用guard做安全解包,避免强制转换崩溃 guard let layOut = self.collectionView?.collectionViewLayout as? UICollectionViewFlowLayout else { return } let cellWidthIncludingSpacing = layOut.itemSize.width + layOut.minimumLineSpacing // 明确变量名,避免类型混淆 let currentOffsetX = targetContentOffSet.pointee.x // 修正:直接使用currentOffsetX,无需加.x let index = (currentOffsetX + scrollView.contentInset.left) / cellWidthIncludingSpacing // 修正:应该对计算出的index取整,之前写错成visibleWidth了 let roundedIndex = round(index) // 定义CGPoint类型的目标偏移量 let targetOffset = CGPoint( x: roundedIndex * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top ) // 把最终偏移量赋值给指针指向的内容 targetContentOffSet.pointee = targetOffset } }
额外优化说明
- 把强制类型转换
as!改成as?加guard语句,防止布局类型不匹配时直接崩溃; - 变量名改成更清晰的
currentOffsetX和targetOffset,从根源上避免类型混淆; - 修正了
round(visibleWidth)的逻辑错误——应该对计算出的index取整,才能得到正确的目标位置。
内容的提问来源于stack exchange,提问作者AYohannes
相关产品推荐
相关产品推荐

