Значение Label внутри ячейки CollectionView перекрывает старое значение в течение миллисекунды, в то время как reloadItems()
Я уже задавал вопрос по этому поведению. Я думаю, вы понимаете, что я имею в виду, если не спросите. Итак, у меня есть небольшой демонстрационный проект с collectionView и источником данных с целыми числами. В моем проекте я должен обновить ячейки, вызвав reloadItems(at: at: [IndexPath]) из-за меньшего использования процессора. Но когда я обновляю ячейку с помощью reloadItems(at: at: [IndexPath]), я на миллисекунду вижу старое значение из метки ячейки. Это выглядит не идеально.
Вот мой код от ViewController.swift
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return datasource.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let mycell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCell
mycell.cellvalue.text = String(datasource[indexPath.row])
return mycell
}
@IBOutlet weak var cellectionview: UICollectionView!
@IBAction func touchButton(_ sender: Any) {
if datasource[0] == 1 {
datasource[0] = 3
} else {
datasource[0] = 1
}
cellectionview.reloadItems(at: [IndexPath(item: 0, section: 0)])
}
var datasource: [Int] = [1, 2, 3, 4, 5, 6]
override func viewDidLoad() {
super.viewDidLoad()
cellectionview.dataSource = self
cellectionview.delegate = self
// Do any additional setup after loading the view, typically from a nib.
}
}
Очень просто. Когда я касаюсь кнопки, первое значение источника данных изменяется, и я просто вызываю функцию перезагрузки только для первой ячейки.
Вот код для моей CustomCell:
class MyCell: UICollectionViewCell {
@IBOutlet weak var cellvalue: UILabel!
}
2 ответа
С reloadItems(at: [IndexPath])
CollectionView автоматически обновляет значения с помощью анимации по умолчанию FadeInOut. Вы можете избежать этой анимации, просто вызвав функцию func performBatchUpdates(_ updates: (() -> Void)?, completion: ((Bool) -> Void)? = nil)
и с блоком анимации и установите время 0,0.
UIView.animate(withDuration: 0) {
self.cellectionview.performBatchUpdates({
self.cellectionview.reloadItems(at: [IndexPath(item: 0, section: 0)])
}, completion: nil)
}
Попробуйте добавить анимацию, например loading
экран это выглядит лучше в перспективе пользовательского интерфейса.
Используйте сторонние библиотеки, такие как MBProgressHUD
таким образом, ваше приложение выглядит чище, подробности установки смотрите по ссылке.
После добавления MBProgressHUD
ваш код выглядит как...
Создайте простую функцию с возможностью изменения (вызывая ее легко в любое время)
func needSomeAnimation(msg: String, mode: MBProgressHUDMode){
let loadingNotification = MBProgressHUD.showAdded(to: self.view, animated: true)
loadingNotification.mode = mode
loadingNotification.label.text = msg
loadingNotification.hide(animated: true, afterDelay: 2.0)
}
Теперь позвоните, где вам это нужно.
@IBAction func touchButton(_ sender: Any) {
needSomeAnimation(msg: "Loading", mode: MBProgressHUDMode.indeterminate)
if datasource[0] == 1 {
datasource[0] = 3
} else {
datasource[0] = 1
}
cellectionview.reloadItems(at: [IndexPath(item: 0, section: 0)])
}
Я надеюсь, что мое решение работает для вас: D