我有一个 collectionView,用于显示我的入门屏幕。每个单元格都占据视图的完整宽度和高度,目前我可以在每个单元格(页面)之间正常滑动。
我必须实现一个下一个按钮。此按钮只会在每次单击时将 collectionView 移动 1 个索引(直到结束)。我现在只是想让它动起来,尽管有一些类似的问题,但到目前为止我还没有找到解决方案。
这是我尝试过的
@IBAction func nextPageButtonClicked(_ sender: AnyObject) {
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
let currentItem: NSIndexPath = visibleItems.object(at: 0) as! NSIndexPath
let nextItem: NSIndexPath = NSIndexPath(row: currentItem + 1, section: 0)
self.collectionView.scrollToItem(at: nextItem as IndexPath, at: .left, animated: true)
}
我在第 4 行 (currentItem + 1) 上执行二元运算符时遇到错误,但即使我对数字进行硬编码并尝试运行它,我仍然无法使滚动发挥作用
尝试这些方法来增加集合单元格的左侧和右侧
对于右增量
@IBAction func Btn_RightAction(_ sender: Any)
{
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
let currentItem: IndexPath = visibleItems.object(at: 0) as! IndexPath
let nextItem: IndexPath = IndexPath(item: currentItem.item + 1, section: 0)
if nextItem.row < ImgArr.count {
self.collectionView.scrollToItem(at: nextItem, at: .left, animated: true)
}
}
对于左增量
@IBAction func Btn_LeftAction(_ sender: Any)
{
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
let currentItem: IndexPath = visibleItems.object(at: 0) as! IndexPath
let nextItem: IndexPath = IndexPath(item: currentItem.item - 1, section: 0)
if nextItem.row < ImgArr.count && nextItem.row >= 0{
self.collectionView.scrollToItem(at: nextItem, at: .right, animated: true)
}
}
您正在尝试增加索引路径,则必须增加索引路径的行。
let nextItem = NSIndexPath(row: currentItem.row + 1, section: 0)
示例
@IBAction func nextPageButtonClicked(_ sender: AnyObject) {
guard let indexPath = collectionView.indexPathsForVisibleItems.first.flatMap({
IndexPath(item: $0.row + 1, section: $0.section)
}), collectionView.cellForItem(at: indexPath) != nil else {
return
}
collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
}
@IBAction func showNextItemCollectionViewOnClick(_ sender: Any) {
let visibleItems: NSArray = self.collectionView.indexPathsForVisibleItems as NSArray
var minItem: NSIndexPath = visibleItems.object(at: 0) as! NSIndexPath
for itr in visibleItems {
if minItem.row > (itr as AnyObject).row {
minItem = itr as! NSIndexPath
}
}
let nextItem = NSIndexPath(row: minItem.row + 1, section: 0)
self.collectionView.scrollToItem(at: nextItem as IndexPath, at: .left, animated: true)
}
步骤:
注意:即使集合视图中存在多个项目并且单击按钮时,如果我们希望移动多个项目将“1”更改为所需值,我们希望多“一个”项目可见,这也适用。
ios 14 上的 collectionView.scrollToItem 函数存在问题。所以你可以尝试这个
extension UICollectionView {
func scrollToNextItem() {
let contentOffset = CGFloat(floor(self.contentOffset.x + self.bounds.size.width))
self.moveToFrame(contentOffset: contentOffset)
}
func moveToFrame(contentOffset : CGFloat) {
self.setContentOffset(CGPoint(x: contentOffset, y: self.contentOffset.y), animated: true)
}
}
这是你的按钮操作
@IBAction func nextButtonAct(_ sender: Any) {
collectionView.scrollToNextItem()
}
对于我在 ios 14 中使用的情况,上述解决方案无法正常工作。所以在这里 是解决方案。
extension UICollectionView {
func scrollToNextItem() {
let contentOffset = CGFloat(floor(self.contentOffset.x +
self.bounds.size.width))
self.moveToFrame(contentOffset: contentOffset)
}
func scrollToPreviousItem() {
let contentOffset = CGFloat(floor(self.contentOffset.x - self.bounds.size.width))
self.moveToFrame(contentOffset: contentOffset)
}
func moveToFrame(contentOffset : CGFloat) {
self.setContentOffset(CGPoint(x: contentOffset, y: self.contentOffset.y), animated: true)
}}
用途:
func rightButtonTapped() {
infoCollectionView.scrollToNextItem()
}
func leftButtonTapped() {
infoCollectionView.scrollToPreviousItem()
}
对于 didTapBack,您只需要当前页面,但在 didTapForward 中,您还需要检查 currentPage 是否未到达 yourArray
的最后一个索引if currentPage > self.yourArray.count - 2 { return }
确保您没有到达最后一个索引
@IBAction func didTapBack(_ sender: Any) { let indexPath = IndexPath(item: currentPage - 1, section: 0) collectionView.scrollToItem(at: indexPath, at: .left, animated: true) } @IBAction func didTapForward(_ sender: Any) { if currentPage > self.yourArray.count - 2 { return } let indexPath = IndexPath(item: currentPage + 1, section: 0) collectionView.scrollToItem(at: indexPath, at: .right, animated: true) }
这是单击按钮时滚动集合视图的解决方案。
注意: sender.tag 用于处理左右滚动。
let visibleItems = collecitonView.indexPathsForVisibleItems.sorted { $0 < $1 }
guard let indexPath = sender.tag == 0 ? visibleItems.first : visibleItems.last else {
return
}
let nextItem: IndexPath = IndexPath(item: sender.tag == 0 ? indexPath.item - 1 : indexPath.item + 1, section: 0)
if nextItem.row < 10 && nextItem.row >= 0{
collecitonView.scrollToItem(at: nextItem, at: .centeredHorizontally, animated: true)
}