Я делаю временную шкалу сортировки с горизонтальным collectionView, где для каждого блока времени (месяца) у меня есть ячейка с UIViews для каждого дня с разными цветами.В некоторые месяцы добавлено 30 просмотров, 31 - 28. У меня возникли проблемы с динамическим добавлением представлений в каждую ячейку, чтобы они не дублировались или добавлялись не в ту ячейку.
С этой целью я создал упрощенную версию этой временной шкалы, где к каждому месяцу динамически добавляется только 1 слой / представление - затем я попытаюсь заняться добавлением переменного количества представлений / слоев.
Я сделал этот проект как самый простой пример того, о чем я говорю:
https://github.com/AlexMarshall12/testTimeline-iOS
Вот код в ViewController.swift:
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
var filledCells: [Int] = []
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
self.filledCells = [1,28]
collectionView.delegate = self
collectionView.dataSource = self
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 28
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as! MyCollectionViewCell
print(indexPath.item)
cell.myLabel.text = String(indexPath.item)
if filledCells.contains(indexPath.item) {
let tickLayer = CAShapeLayer()
tickLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: cell.layer.bounds.width, height: cell.layer.bounds.height), cornerRadius: 5).cgPath
tickLayer.fillColor = UIColor(red:0.99, green:0.13, blue:0.25, alpha:0.5).cgColor
cell.layer.addSublayer(tickLayer)
} else {
//updated
let tickLayer = CAShapeLayer()
tickLayer.path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: cell.layer.bounds.width, height: cell.layer.bounds.height), cornerRadius: 5).cgPath
tickLayer.fillColor = UIColor(red:0.1, green:0.13, blue:0.98, alpha:0.5).cgColor
cell.layer.addSublayer(tickLayer)
}
return cell
}
}
Идея состоит в том, что для каждого элемента indexPath (каждой ячейки?) Он проверяет, содержится ли он в массиве self.filledCells: 1 или 28, которые являются внешними краями, поскольку возвращаются 28 ячеекдля номераOfItemsInSection и 1 раздела.Поэтому я хотел, чтобы каждая ячейка была светло-синей, за исключением первой и 28-й - светло-красной.
Однако, как вы можете видеть здесь https://imgur.com/a/KTLn7Cb. Есть несколько оттенков синего, красного и пурпурного, когда ячейки заполняются несколько раз, когда я прокручиваю взад и вперед, конечно, кроме 1 и 28.
Я думаю, что есть две проблемы.
- Каким-то образом indexPath.item возвращает 1 или 28, даже если я не прокручиваюсь до самых крайних ячеек.Почему это?
- Когда я снова обращаюсь к уже отрисованным ячейкам, он перерисовывает их.Я не уверен, почему это так.Мне было интересно, может ли помочь переопределение prepareForReuse (), но я слышал, что это часто плохая идея, поэтому я не уверен, что это то, что я ищу.
Любой совет по достижению этого?