Давайте рассмотрим, что элементы образуют массив строк, и вы отслеживаете выбранные индексы как диапазон.
var selectedRange: Range<Int>? {
didSet {
collectionView.reloadData()
}
}
var items: [String] = [] {
didSet {
// To make sure that the selected indices are reset everytime this array is modified,
// so as to make sure that nothing else breaks
if items.count >= 4 {
// Select the last 4 items by default
selectedRange = (items.count - 4)..<items.count
} else if !items.isEmpty {
selectedRange = 0..<items.count
} else {
selectedRange = nil
}
}
}
Затем, когда вы нажимаете кнопку, чтобы уменьшить диапазон, вы можетеиспользуйте эту логику для обработки того же:
func decrementRange() {
if var startIndex = selectedRange?.startIndex,
var endIndex = selectedRange?.endIndex {
startIndex = max((startIndex - 4), 0)
endIndex = min(max((startIndex + 4), (endIndex - 4)), items.count)
selectedRange = startIndex..<endIndex
}
}
Затем вы можете определить, выполняется ли выбор в активном диапазоне, используя:
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
if let selectedRange = selectedRange {
return selectedRange.contains(indexPath.item)
}
return false
}
Примечание : Я бы посоветовал вам проверить, охватывает ли это все угловые случаи, прежде чем пробовать его для производственного кода.