我已经针对这种行为问了一个问题。我想你明白我的意思,如果不请问。因此,我有一个带有collectionView的演示项目和一个带有整数的数据源。在我的项目中,由于CPU使用率较低,因此必须通过调用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!
}
答案 0 :(得分:1)
使用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)
}
答案 1 :(得分:0)
尝试添加一些动画,例如loading
屏幕,这从用户界面的角度来看也更好。
使用MBProgressHUD
之类的第三方库可以使您的应用看起来更简洁,有关安装详细信息,请检查link。
添加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