单击 collection 视图中的图像可选择其他图像
Clicking an image in collection view selects other images
我有以下代码:
import UIKit
import Photos
import PhotosUI
private let reuseIdentifier = "Cell"
class CollectionVC: UICollectionViewController, UICollectionViewDelegateFlowLayout {
var imageArray = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
grapPhotos()
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageArray.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath as IndexPath)
let imageView = cell.viewWithTag(1) as! UIImageView
collectionView.allowsMultipleSelection = true
cell.layer.cornerRadius = 4
imageView.image = imageArray[indexPath.row]
return cell
}
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let cell = collectionView.cellForItem(at: indexPath) {
cell.layer.borderColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
cell.layer.borderWidth = 5
}
}
override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
if let cell = collectionView.cellForItem(at: indexPath) {
cell.layer.borderColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
cell.layer.borderWidth = 0
}
}
func grapPhotos() {
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
requestOptions.deliveryMode = .highQualityFormat
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType = %d || mediaType = %d", PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue)
if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: fetchOptions) {
if fetchResult.count > 0 {
for i in 0..<fetchResult.count {
imgManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: {
image, error in
self.imageArray.append(image!)
})
}
}
else {
self.collectionView?.reloadData()
print("No Photos")
}
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.frame.width / 3 - 6
return CGSize(width: width, height: width)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 6.0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 6.0
}
}
我很抱歉说了很多,但我真的不知道我哪里出错了。这是我的 CollectionViewController 的所有代码,然后在情节提要中我有一个 collection VC,在一个单元格中有一个图像,标签为 1,然后在一个单元格中,标识符为 "Cell"
.我遇到的问题是,当我 运行 我的 phone 上的代码时,select 一张图像最终 select 其他图像。例如:我 select 第一张图片,然后向下滚动,另一张图片已经 selected。我做了一点测试,前 21 张图像几乎是独一无二的。但是好像图像几乎具有相同的 ID。与 select 第一张图片一样,也 select 第 22 张图片。顺便说一下,我正在构建一个自定义图像选择器。
这里有不止一个问题,但您抱怨的主要问题是因为您忘记了细胞是重复使用的。您需要在 cellForItem
中配置单元格,而不是在 didSelect
和 didDeselect
.
中
当您的 didSelect
转身并直接与物理细胞对话时,它在做完全错误的事情。相反,didSelect
和 didDeselect
应该与您的 数据模型 对话,在模型的对象中设置一些 属性 表示 [=26 处的对象=]这些索引路径应该被认为是被选中的,而这些其他索引路径的对象不应该。然后重新加载数据。
然后,当 cellForItem
出现时,它必须根据数据模型和索引 完全 配置其单元格,显示其选择的外观或未选择的外观小路。这样,如果一个单元格位于先前选定的行中,但现在在未选定的行中重复使用,则它具有所需的未选定外观。
换句话说,只有 cellForItem
应该用细胞来思考。其他人应该只考虑索引路径(或者更好,根据与数据关联的某些唯一标识符,但这是另一回事)。
我有以下代码:
import UIKit
import Photos
import PhotosUI
private let reuseIdentifier = "Cell"
class CollectionVC: UICollectionViewController, UICollectionViewDelegateFlowLayout {
var imageArray = [UIImage]()
override func viewDidLoad() {
super.viewDidLoad()
grapPhotos()
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageArray.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath as IndexPath)
let imageView = cell.viewWithTag(1) as! UIImageView
collectionView.allowsMultipleSelection = true
cell.layer.cornerRadius = 4
imageView.image = imageArray[indexPath.row]
return cell
}
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let cell = collectionView.cellForItem(at: indexPath) {
cell.layer.borderColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
cell.layer.borderWidth = 5
}
}
override func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
if let cell = collectionView.cellForItem(at: indexPath) {
cell.layer.borderColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
cell.layer.borderWidth = 0
}
}
func grapPhotos() {
let imgManager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
requestOptions.deliveryMode = .highQualityFormat
let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
fetchOptions.predicate = NSPredicate(format: "mediaType = %d || mediaType = %d", PHAssetMediaType.image.rawValue, PHAssetMediaType.video.rawValue)
if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: fetchOptions) {
if fetchResult.count > 0 {
for i in 0..<fetchResult.count {
imgManager.requestImage(for: fetchResult.object(at: i), targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: requestOptions, resultHandler: {
image, error in
self.imageArray.append(image!)
})
}
}
else {
self.collectionView?.reloadData()
print("No Photos")
}
}
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.frame.width / 3 - 6
return CGSize(width: width, height: width)
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 6.0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 6.0
}
}
我很抱歉说了很多,但我真的不知道我哪里出错了。这是我的 CollectionViewController 的所有代码,然后在情节提要中我有一个 collection VC,在一个单元格中有一个图像,标签为 1,然后在一个单元格中,标识符为 "Cell"
.我遇到的问题是,当我 运行 我的 phone 上的代码时,select 一张图像最终 select 其他图像。例如:我 select 第一张图片,然后向下滚动,另一张图片已经 selected。我做了一点测试,前 21 张图像几乎是独一无二的。但是好像图像几乎具有相同的 ID。与 select 第一张图片一样,也 select 第 22 张图片。顺便说一下,我正在构建一个自定义图像选择器。
这里有不止一个问题,但您抱怨的主要问题是因为您忘记了细胞是重复使用的。您需要在 cellForItem
中配置单元格,而不是在 didSelect
和 didDeselect
.
当您的 didSelect
转身并直接与物理细胞对话时,它在做完全错误的事情。相反,didSelect
和 didDeselect
应该与您的 数据模型 对话,在模型的对象中设置一些 属性 表示 [=26 处的对象=]这些索引路径应该被认为是被选中的,而这些其他索引路径的对象不应该。然后重新加载数据。
然后,当 cellForItem
出现时,它必须根据数据模型和索引 完全 配置其单元格,显示其选择的外观或未选择的外观小路。这样,如果一个单元格位于先前选定的行中,但现在在未选定的行中重复使用,则它具有所需的未选定外观。
换句话说,只有 cellForItem
应该用细胞来思考。其他人应该只考虑索引路径(或者更好,根据与数据关联的某些唯一标识符,但这是另一回事)。