- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下设置:UICollectionView
使用自定义单元格,用户可以在其中选择多个单元格,然后执行一些繁重的图像操作。现在我尝试使用该操作的结果更新用户选择的选定单元格,这将由子类自定义单元格的函数产生。对于所有可见单元格,该函数在用户按下按钮时调用,对于所有其他单元格,这通过 cellForItemAt
发生。为了最有效率。
但是,我现在面临的问题是,可见单元格都已更新,但是在滚动可见单元格之后或之前的单元格之后 不更新 通过 cellForItemAt
但仅在来回滚动时。请参阅随附的视频。
出于演示目的,我只显示绿色 UIView
用于图像操作。因为该操作需要大量资源,我不能使用任何 UICollectionView
重载数据 或类似的,因为它们会取消选择选定的单元格,并且手动重新选择会导致闪烁。
View Controller
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
// data source
var items: [String] = ["Lynna", "Vickie", "Emmerich", "Chere", "Patrizius", "Micky", "Sarena", "Jewell", "Audrye", "Rockwell", "Lari", "Travis", "Ber", "Oneida", "Bethanne", "Geri", "Gray", "Wolfie", "Hallsy", "Vanna", "Aline", "Winslow", "Amelita", "Janek", "Samuel", "Jaclin", "Dick", "Jeanine", "Brandy", "Munroe", "Felice", "Melonie", "Esta", "Bria", "Kenon", "Roarke", "Gerry", "Carmel", "Conrado", "Jaquelin", "Avrit", "Noam", "Kleon", "Edith", "Carine", "Jackie", "Franni", "Riccardo", "Theda", "Virgina", "Carleen", "Gregorio", "Taylor", "Ellsworth", "Adolphus", "Annabella", "Natalya", "Celina", "Cathrine", "Evie", "Gasper", "Aguste", "Jory", "Farrell", "Natasha", "Deborah", "Pietro", "Lucila", "Yuri", "Micheil", "Claus", "Nelson", "Elisa", "Alfons", "Nicolea", "Sofia", "Geordie", "Anette", "Myrtice", "Tami", "Lucien", "Brigida", "Claire", "Brennan", "Kendal", "Jillana", "Adelaida", "Charles", "Mart", "Hastie", "Dewain", "Heida", "Karisa", "Arleyne", "Margi", "Brent", "Natalie", "Ashton", "Teodorico", "Prentice", "Rolando", "Tootsie", "Fonz", "Tremayne", "Bernardo", "Guthrie", "Hendrick", "Constantina", "Lin", "Reece", "Horace", "Celka", "Amata", "Dunc", "Franchot", "Niko", "Janna", "Jacklyn", "Eddy", "Ashely", "Angelica", "Pinchas", "Krishnah", "Edmon", "Darnell", "Alyson", "Pearle", "Ashla", "Chickie", "Ada", "Elane", "Bethanne-Two", "Lon", "Marlin", "Karissa", "Ellswerth", "Lisbeth", "Cortie", "Lucille", "Lissa", "Markos", "Alys", "Orrin", "Nancy", "Pepe", "Lauren", "Wyndham", "Belle", "Gordie", "Marcille", "Idaline", "Hillary", "Enrique", "Murielle", "Juliann", "Beatrisa", "Lavinia", "Noni", "Justino", "Hasty", "Sile", "Kiley", "Shepard", "Nickie", "Ly", "Dannel", "Tressa", "Merci", "Rog", "Frans", "Bernita", "Ginnie", "Niko-Two", "Sheilakathryn", "Whitman", "Kendell", "Florenza", "Marybeth", "Drusi", "Paulina", "Fina", "Moria", "Jacobo", "Rowan", "Mariejeanne", "Luelle", "Vicki", "Auria", "Trisha", "Ken", "Carline", "Dorry", "Forrester", "Wylie", "Elset", "Francyne", "Bondy", "Demott", "Erik", "Elenore", "Correy", "Isadora", "Mason", "Barris", "Marlee", "Haslett", "Lorette", "Arlyn", "Genna", "Trude", "Parnell", "Albina", "Spencer", "Lefty", "Luigi", "Winnie", "Torie", "Zita", "Bert", "Danyelle", "Aldis", "Rivy", "Niels", "Monte", "Sandy", "Georgeta", "Durante", "Cobbie", "Kathryn", "Dinnie", "Fanchon", "Say", "Ethelred", "Vick", "Betteanne", "Orazio", "Mannie", "Jinny", "Kerrin", "Abagail", "Reyna", "Tomlin", "Shelton", "Noble", "Massimiliano", "Madel", "Cayla", "Mathias", "Tod", "Liana", "Celia", "Antoni", "Ruthann", "Irvine", "Leisha", "Geri-Two", "Marlie", "Pascale", "Latia", "Minne", "Arlette", "Rhys", "Flint", "Sollie", "Hinda", "Igor", "Marcella", "Wilma", "Marijo", "Marika", "Pooh", "Roland", "Sergent", "Fawnia", "Valaree", "Evonne", "Angeline", "Welbie", "Mace", "Niles", "Grannie", "Berenice", "L;urette", "Nert", "Rheba", "Cristie", "Lazar", "Amil", "Yanaton", "Luella", "Herold", "Enrique-Two", "Joanna", "Dom", "Crista", "Ellyn", "Ema", "Romona", "Dona", "Madelina", "Nevsa", "Conway", "Laverna", "Orion", "Leighton", "Earle"]
// stores the selected items
var selectedItems = [String]()
var applyImageOperation = false
override func viewDidLoad() {
super.viewDidLoad()
// Set up collection view
let layout = UICollectionViewFlowLayout()
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 0
collectionView.collectionViewLayout = layout
collectionView.allowsMultipleSelection = true
collectionView.delegate = self
collectionView.dataSource = self
self.collectionView!.register(MyCustomCell.self, forCellWithReuseIdentifier: "CELL")
self.collectionView!.contentInset = UIEdgeInsets(top: 6, left: 6, bottom: 6, right: 6)
}
@IBAction func btnSelectAllPressed(_ sender: Any) {
// Add all items to the seleted array
selectedItems = [String]() // empty the current selection first
for item in items {
selectedItems.append(item)
}
// Update the collection view visually by selecting all cells
for i in 0..<collectionView.numberOfItems(inSection: 0) {
collectionView.selectItem(at: IndexPath(row: i, section: 0), animated: false, scrollPosition: [])
}
}
@IBAction func btnApplyImageOperationPressed(_ sender: Any) {
// set image operation mode true if we have items selected
if selectedItems.count > 0 {
applyImageOperation = true
}
// All visible cells should call activateImageOperationMode() - all others will do in cellForItem
for visibleCell in collectionView.visibleCells {
if let cell = visibleCell as? MyCustomCell {
if let name = cell.titleLabel.text {
if selectedItems.contains(name) {
cell.activateImageOperationMode()
}
}
}
}
}
}
extension ViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: ((collectionView.frame.width-12)/3), height: ((collectionView.frame.width-12)/3))
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CELL", for: indexPath) as! MyCustomCell
cell.titleLabel.text = items[indexPath.row]
// if image operation is not active, we don't show / remove the view
if !applyImageOperation {
cell.deactivateImageOperationMode()
}
// if image operation is active, we show the view for all selected items
else {
// Check if cell is selected
if selectedItems.contains(items[indexPath.row]) {
cell.activateImageOperationMode()
}
// If cell is not selected
else {
cell.deactivateImageOperationMode()
}
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// Add item to selectedItems
if !selectedItems.contains(items[indexPath.row]) {
selectedItems.append(items[indexPath.row])
}
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
// Remove item from selectedItems
if selectedItems.contains(items[indexPath.row]) {
selectedItems.removeAll{ $0 == items[indexPath.row] }
}
}
}
import UIKit
class MyCustomCell: UICollectionViewCell {
let titleLabel: UILabel = {
let l = UILabel()
l.translatesAutoresizingMaskIntoConstraints = false
l.text = "n/a"
l.textColor = .red
l.textAlignment = .center
return l
}()
let bgColor: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .lightGray
return v
}()
var myImageOperationView: UIView?
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.commonInit()
}
func commonInit(){
// Configure Selection Background View
selectedBackgroundView = {
let view = UIView()
view.backgroundColor = .red
return view
}()
// Set std BG color
contentView.addSubview(bgColor)
bgColor.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 6).isActive = true
bgColor.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -6).isActive = true
bgColor.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 6).isActive = true
bgColor.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -6).isActive = true
// Setup label
bgColor.addSubview(titleLabel)
titleLabel.topAnchor.constraint(equalTo: bgColor.topAnchor, constant: 0).isActive = true
titleLabel.bottomAnchor.constraint(equalTo: bgColor.bottomAnchor, constant: 0).isActive = true
titleLabel.leftAnchor.constraint(equalTo: bgColor.leftAnchor, constant: 0).isActive = true
titleLabel.rightAnchor.constraint(equalTo: bgColor.rightAnchor, constant: 0).isActive = true
}
func activateImageOperationMode() {
if myImageOperationView == nil {
// HERE WOULD BE SOME HEAVY IMAGE OPERATION
// Adding this view is just a placeholder for demonstration
myImageOperationView = UIView()
myImageOperationView!.translatesAutoresizingMaskIntoConstraints = false
myImageOperationView!.backgroundColor = .green
bgColor.addSubview(myImageOperationView!)
myImageOperationView!.topAnchor.constraint(equalTo: bgColor.topAnchor, constant: 0).isActive = true
myImageOperationView!.bottomAnchor.constraint(equalTo: bgColor.bottomAnchor, constant: 0).isActive = true
myImageOperationView!.leftAnchor.constraint(equalTo: bgColor.leftAnchor, constant: 0).isActive = true
myImageOperationView!.rightAnchor.constraint(equalTo: bgColor.rightAnchor, constant: 0).isActive = true
// bring label to top
bgColor.bringSubviewToFront(titleLabel)
}
}
func deactivateImageOperationMode() {
if myImageOperationView != nil {
myImageOperationView!.removeFromSuperview()
myImageOperationView = nil
}
}
}
最佳答案
UICollectionView 默认为 prefetchingEnabled
== YES
,这意味着 Collection View 将在需要显示单元格之前请求它们。如果应用程序的状态发生变化,使得已经获取的单元格需要以不同的方式显示,您可以实现 collectionView:willDisplayCell:forItemAtIndexPath:
更新单元格的方法。
看起来这正是您的问题……您打开了一个应该改变单元格外观的功能,但是已获取但不可见的单元格不会得到更新。实现 collectionView:willDisplayCell:forItemAtIndexPath:
应该解决问题。
关于ios - UICollectionView 没有通过 cellForItemAt 正确更新所有单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495793/
我已经尝试在我的 CSS 中添加一个元素来删除每三个 div 的 margin-right。不过,似乎只是出于某种原因影响了第 3 次和第 7 次。需要它在第 3、6、9 等日工作... CSS .s
如何使 div/input 闪烁或“脉冲”?例如,假设表单字段输入了无效值? 最佳答案 使用 CSS3 类似 on this page ,您可以将脉冲效果添加到名为 error 的类中: @-webk
我目前正在尝试构建一个简单的 wireframe来自 lattice 的情节包,但由沿 y 轴的数百个点组成。这导致绘图被线框网格淹没,您看到的只是一个黑色块。我知道我可以用 col=FALSE 完全
在知道 parent>div CSS 选择器在 IE 中无法识别后,我重新编码我的 CSS 样式,例如: div#bodyMain div#paneLeft>div{/*styles here*/}
我有两个 div,一个在另一个里面。当我将鼠标悬停 到最外面的那个时,我想改变它的颜色,没问题。但是,当我将鼠标悬停 到内部时,我只想更改它的颜色。这可能吗?换句话说,当 将鼠标悬停到内部 div 上
我需要展示这样的东西 有人可以帮忙吗?我可以实现以下输出 我正在使用以下代码:: GridView.builder( scrollDirection: Axis.vertical,
当 Bottom Sheet 像 Android 键盘一样打开时,是否有任何方法可以手动上推布局( ScrollView 或回收器 View 或整个 Activity )?或者你可以说我想以 Bott
我有以下代码,用于使用纯 HTML 和 CSS 显示翻转。当您将鼠标悬停在文本上时,它会更改左右图像。 在我测试的所有浏览器中都运行良好,Safari 4 除外。据我收集的信息,Safari 4 支持
我构建了某种 CMS,但在使用 TinyMCE 和 Bootstrap 时遇到了一些问题。 我有一个页面,其中概述了一个 div,如果用户单击该 div,他们可以从模态中选择图像。该图像被插入到一个
出于某种原因,当我设置一个过渡时,当我的鼠标悬停在一个元素上时,背景会改变颜色,它只适用于一个元素,但它们都共享同一个类?任何帮助我的 CSS .outer_ad { position:rel
好吧,这真的很愚蠢。我不知道 Android Studio 中的调试监视框架发生了什么。我有 1.5.1 的工作室。 是否有一些来自 intellij 的 secret 知识来展示它。 最佳答案 与以
我有这个标记: some code > 我正在尝试获取此布局: 注意:上一个和下一个按钮靠近#player 我正在尝试这样: .nextBtn{
网站:http://avuedesigns.com/index 首页有 6 个菜单项。我希望每件元素在您经过时都有自己的颜色。 这是当您将鼠标悬停在 div 上时将所有内容更改为白色的行 li#hom
我需要在 index.php 文件中显示它,但没有任何效果。我所有的文章都没有正确定位。我将其用作代码: 最佳答案 您可以首先检查您
我是一名优秀的程序员,十分优秀!