我目前正在开发一个UIViewController,顶部有水平collectionView,接下来的几个月(如日历),在它下面我有一个tableView,下一个事件发生在用户所在位置附近。 当用户向下滚动表格视图时,它会获取顶部单元格事件日期并将collectionView滚动到当天。我正在使用以下代码:
在tableView的cellForRowAt上:
datePicker.selectItem(at: selectedIndexPath, animated: true, scrollPosition:UICollectionViewScrollPosition.centeredHorizontally)
在collectionView的cellForItemAt上:
if cell.isSelected {
cell.selectedCircle.layer.cornerRadius = 15
cell.selectedCircle.backgroundColor = UIColor(red:1, green:0.08, blue:0.35, alpha:1)
cell.weekDayLabel.alpha = 1
selectedMonth.text = dateToday.3.firstUppercased
} else {
cell.selectedCircle.backgroundColor = UIColor(red:1, green:0.08, blue:0.35, alpha:0)
cell.weekDayLabel.alpha = 0.4
}
当下一个要选择的collectionView IndexPath远离前一个时,一切都很完美。当它们分别位于8或以下indexPaths时,collectionView会滚动到右侧indexPath,但不会运行isSelected代码。
有什么想法吗?感谢您的时间。
答案 0 :(得分:1)
您好像在单元格内存储isSelected信息。唐'吨。你可能会得到一个以前在其他地方再循环的单元格。保持选择哪些单元格的逻辑(如数组),并根据索引路径查找。
答案 1 :(得分:0)
我遇到了类似的问题。我有一个带有水平滚动和分页的UICollectionView。
只要我没有在不是下一页的前2个单元格或上一页的后2个单元格之一的单元格上不调用selectItem(at:animated:scrollPosition :),一切都很好。
问题似乎是未设置isSelected。而且cellForItem(at :)也没有被调用(我想是因为单元格实际上已经被加载了)。
这是我的解决办法。我将UICollectionView子类化,并覆盖contentOffset以在单元格可能变为可见时得到通知,然后手动设置isSelected。
override var contentOffset: CGPoint {
didSet {
self.refreshVisibleCells()
}
}
func refreshVisibleCells() {
for cell in self.visibleCells {
let cell = cell as! CalendarViewCell
if cell.date == self.selectedDate {
cell.isSelected = true
}
}
}