Я использовал UICollectionView.reloadData()
для обновления своих ячеек на лету, и это сработало отлично, хотя, это делает анимацию чрезвычайно неуклюжей.Я подключаюсь к func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
и выполняю логику для определения пользовательского интерфейса ячеек.
Вот этот код методов:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "RepCollectionViewCell", for: indexPath) as! RepCollectionViewCell
let mask = CAShapeLayer()
let path = UIBezierPath(arcCenter: CGPoint(x: cell.bounds.midX, y: cell.bounds.midY),
radius: cell.bounds.width / 2, startAngle: -CGFloat.pi / 2, endAngle: 2 * .pi, clockwise: true)
path.close()
mask.frame = cell.bounds
mask.path = path.cgPath
var alpha = 1.0
var color = UIColor.white
var size = 0.0
switch reps[indexPath.row] {
case currentRep + 3:
size = FONT_SIZE / 4
case currentRep + 2:
size = FONT_SIZE / 3
case currentRep + 1:
size = FONT_SIZE / 2
case currentRep:
color = .green
size = FONT_SIZE
case currentRep - 1:
size = FONT_SIZE / 2
alpha = 0.75
case currentRep - 2:
size = FONT_SIZE / 3
alpha = 0.50
case currentRep - 3:
size = FONT_SIZE / 4
alpha = 0.25
default:
color = .clear
alpha = 0
}
cell.layer.mask = mask
cell.repCount.text = String(reps[indexPath.row])
cell.backgroundColor = color
cell.repCount.font = UIFont(name: FONT_NAME, size: CGFloat(size))
cell.alpha = CGFloat(alpha)
return cell
}
Теперь, как уже упоминалось, альфа устанавливается правильно при использовании UICollectionView.reloadData()
, но, когда я использую метод UICollectionView.reloadItems(at: [IndexPaths])
и передаю массив indexPaths, альфа-ячейка не обновляется.Тем не менее, цвет фона, размер шрифта, альфа-содержимого contentView и т. Д ... будет обновляться.
Вот код, который я использую для генерации indexPath ячеек, которые должны быть обновлены, и последующего вызова.
private func focusCollectionView()
{
self.MyUICollectionView.reloadItems(at: generateIndexPaths())
self.MyUICollectionView.scrollToItem(at: IndexPath(item: myVar - 1, section: 0), at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
}
private func generateIndexPaths() -> [IndexPath]
{
var indexPaths = [IndexPath]()
if(myVar - 4 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 4, section: 0))
}
if(myVar - 3 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 3, section: 0))
}
if(myVar - 2 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 2, section: 0))
}
if(myVar - 1 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 1, section: 0))
}
indexPaths.append(IndexPath(row: myVar, section: 0))
if(myVar + 1 < _myOtherVar)
{
indexPaths.append(IndexPath(row: myVar + 1, section: 0))
}
if(myVar + 2 < _myOtherVar)
{
indexPaths.append(IndexPath(row: myVar + 2, section: 0))
}
if(myVar + 3 < _myOtherVar)
{
indexPaths.append(IndexPath(row: myVar + 3, section: 0))
}
return indexPaths
}
Вот демонстрация двух результатов, первыйиспользуя 'reloadData', а второй с помощью 'reloadItems': https://imgur.com/a/ECOnYIj
Я не знаю, почему это происходит и что делать, чтобы это исправить, какие-либо идеи?