selectItem如果它们靠近当前选定的单元格,则不选择单元格

时间:2018-05-24 12:53:15

标签: ios swift uicollectionview

我目前正在开发一个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代码。

有什么想法吗?感谢您的时间。

2 个答案:

答案 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
        }
    }
}