- 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/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!