【问题标题】:In auto scrolling UICollectionView cellForItemAtIndexPath not triggered by contentOffset在自动滚动 UICollectionView cellForItemAtIndexPath 不是由 contentOffset 触发
【发布时间】:2018-01-12 20:10:46
【问题描述】:

我正在尝试创建一个自动滚动的 UICollectionView(每个单元格都有一个图像和一个字符串)。滚动使用contentOffset 可以正常工作,但由于cellForItem 从未触发过,因此永远不会加载新的/不可见的单元格。我不想使用scrollToItem...contentOffset 允许慢速滚动效果。我也不能使用任何需要持续时间的东西,因为我希望它一直运行到用户更改视图为止。这是我正在使用的代码:

func configAutoScrollTimer() {
    signInTimer = Timer.scheduledTimer(timeInterval: 0.03, target: self, selector: #selector(autoScrollView), userInfo: nil, repeats: true)
}

func deconfigAutoScrollTimer() {
    signInTimer.invalidate()
    scrollX = 0
}

@objc func autoScrollView() {
    scrollX += 1

    let offsetPoint = CGPoint(x: scrollX, y: 0)
    collectionView.contentOffset = offsetPoint
    collectionView.layoutIfNeeded()
}

configureAutoSrollTimer() 在视图加载时被调用。关于如何加载不可见单元格的任何想法?

【问题讨论】:

  • 这段代码在我的测试项目中运行良好。您未在此处显示的代码中肯定还有其他内容。也许在集合视图或它的单元格的设置中。当您说 UI 加载时未加载屏幕外的单元格时,您是什么意思?您是指在滚动开始之前首次显示集合视图的时间吗?
  • 他的意思是带偏移量的自动滚动不会触发 cellForRow 所以没有新的单元格显示
  • 好的,谢谢。我应该在正文中重申这一点。编辑问题以澄清
  • 你确定你有足够的内容吗?由于您正在增加内容偏移量,因此即使您没有要加载的单元格,它也会继续滚动。
  • 是的,我还有很多内容。

标签: swift uicollectionview tvos


【解决方案1】:

将collectionView的宽度约束挂钩为IBOutlet

并在 viewDidLayoutSubviews 中执行此操作

 self.collectionViewWithCon.constant = numOfCells*cellWidth

编辑:

@objc func autoScrollView() {
   self.collectionViewLeadCon.constant -= 1.0
   self.collectionViewWithCon.constant += cellWidth
   collectionView.layoutIfNeeded()
 }

【讨论】:

  • 没有宽度限制。我有,前导/尾随/底部到超级视图和高度。
  • 默认情况下,collectionView 继承自 scrollview 给它屏幕宽度并按照答案更改它,看看是否加载了单元格,我的想法是我需要拉伸 collectionview 的宽度以绘制单元格甚至超出屏幕,我从答案中假设它是水平滚动
  • 设置一个非常高的宽度会起作用,但并不理想。这是针对将打开约一个小时的屏幕上的 Apple tv 应用程序。这意味着这将滚动(水平)至少一个小时。我必须将宽度设置得太高,这样会一次加载太多的单元格。必须有办法触发cellForItem 动态加载另一个单元格
  • 好的,然后在定时器回调中逐渐改变宽度
  • 这会使conetentOffset 无效,将其重置为 0,0
猜你喜欢
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多