【发布时间】:2018-09-05 18:17:37
【问题描述】:
编辑:大图:我正在尝试像这样构建一个时间轴: 时间轴中的每个单元格代表一个月,所以 May 是水平 collectionView 中的最后一个单元格。我想要的是当 collectionView 加载时,如果它不可见,它会自动滚动到可能,然后调用单元格上的特定函数来绘制箭头。我用来尝试执行此操作的代码如下。
这是我的代码:
var onceOnlyCollectionView = false
var onceOnlyTimeline = false
internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if collectionView == self.collectionView {
if !onceOnlyCollectionView {
let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
onceOnlyCollectionView = true
}
} else if collectionView == self.timeline {
if !onceOnlyTimeline {
let firstPost = posts.first?.timeStamp
let firstOfFirstMonth = firstPost?.startOfMonth()
let diff = posts.last?.timeStamp.months(from: firstOfFirstMonth!)
//self.currentPostMonth = diff
let monthCellIndexPath = IndexPath(row: diff!, section: 0)
timeline.scrollToItem(at: monthCellIndexPath, at: .centeredHorizontally, animated: false)
let months = self.posts.first?.timeStamp.startOfMonth().months(from: (self.posts.last?.timeStamp)!)
print("cells are",self.timeline.visibleCells)
if let optionalCell = timeline.cellForItem(at: IndexPath(row: months!, section: 0)) {
let cell = optionalCell as! TimelineMonthViewCell
let day = Calendar.current.component(.day, from: self.currentPostDate!)
cell.drawArrow(day: day)
} else {
print("cell out of range")
}
onceOnlyTimeline = true
}
}
}
现在,它确实成功滚动到可能,但是它打印“单元格是 []”和“单元格超出范围”并且没有绘制红色箭头。这里发生了什么,我如何访问这个新滚动的单元格?
【问题讨论】:
-
"我试图在它加载之前调用它。"这意味着什么?或许您应该从高层次上解释您正在尝试做什么,而不是寻求特定解决方案的帮助?
-
@DuncanC 我对问题进行了大量编辑以包含更大的图景。如果这是您的想法,或者我是否应该添加更多内容,请告诉我
-
在
willDisplay()方法中使用 scrollToItem 似乎是个坏主意。我实际上从未使用过collectionView(_:willDisplay:forItemAt:),但从文档中,听起来该方法在创建单元格时被调用,但在它被添加到集合视图之前。因此,当屏幕上还没有单元格时调用它是完全合理的。在创建单元格并将其添加到集合视图时,它将被重复调用。试图在该方法内滚动必然会导致问题。相反,您应该在 viewDidLoad 方法中调用 scrollToItem()。 -
好的,我将代码放在 viewDidLoad 中,但仍然找不到那些单元格嗯
标签: ios swift uiscrollview uicollectionview