为什么集合视图中的选定单元格在 UICollection 视图中无法正确显示 Swift 3?
why selected cell in collection view doesn't show correctly in the UICollection View Swift 3?
我正在使用 swift 3,我的应用程序中有集合视图,其中显示 iPhone 画廊。一切都很好但我希望用户可以 select 一些照片,这可能会发生但问题是我在每个单元格中使用了另一个小图像,当用户 select 该单元格时图片将显示用户可以理解该单元格已被 select 编辑的勾号 - 这将在开始时起作用,但是当用户滚动集合视图时,一些用户没有 select 的单元格也有这个勾号!
**请记住,select 和 did deselect 运行良好,问题仅在于显示此勾号 **
**我在单元格中有带有标签的图像,当用户 select 单元格或 didDeselect **
时,该图像将显示勾号或不显示任何内容
我知道这些代码比你想象的要多但是很多人需要访问所有代码所以你可以在下面看到我的代码
import UIKit
import Photos
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
let arr_img = NSMutableArray()
@IBOutlet var collview: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let allPhotosOptions : PHFetchOptions = PHFetchOptions.init()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allPhotosResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
allPhotosResult.enumerateObjects({ (asset, idx, stop) in
self.arr_img.add(asset)
})
}
func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
let retinaScale = UIScreen.main.scale
let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//CGSizeMake(size * retinaScale, size * retinaScale)
let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
let square = CGRect(x: 0, y: 0, width: cropSizeLength, height: cropSizeLength)//CGRectMake(0, 0, CGFloat(cropSizeLength), CGFloat(cropSizeLength))
let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
var thumbnail = UIImage()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.normalizedCropRect = cropRect
manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK:
//MARK: Collectioview methods
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return arr_img.count
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
for: indexPath)
let imgview : UIImageView = cell.viewWithTag(20) as! UIImageView
imgview.image = self.getAssetThumbnail(asset: self.arr_img.object(at: indexPath.row) as! PHAsset, size: 150)
return cell
}
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
let cell = collectionView.cellForItem(at: indexPath as IndexPath)
if cell!.isSelected == true {
print(indexPath)
cell?.backgroundColor = UIColor.orange
print("Cell is Selected!")
let selectView : UIImageView = cell?.viewWithTag(22) as! UIImageView
selectView.image = UIImage(named: "Select.png")
}
else if cell!.isSelected != true {
collectionView.cellForItem(at: indexPath as IndexPath)
cell?.backgroundColor = UIColor.clear
let selectView : UIImageView = cell?.viewWithTag(22) as! UIImageView
selectView.image = nil
print("Cell is Not Selected!")
}
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath as IndexPath)
print(indexPath)
if cell?.isSelected == true {
cell?.backgroundColor = UIColor.orange
print("Cell is Selected In Deselect!")
let selectView : UIImageView = cell!.viewWithTag(22) as! UIImageView
selectView.image = nil
collectionView.cellForItem(at: indexPath as IndexPath)
}
else if cell?.isSelected != true {
cell?.backgroundColor = UIColor.clear
collectionView.cellForItem(at: indexPath as IndexPath)
print("Cell is DeSelected!")
let selectView : UIImageView = cell!.viewWithTag(22) as! UIImageView
selectView.image = nil
}
}
只需在您的单元格内放置一个按钮并为其添加标签。
获取数组并执行以下操作。
let arr_selected = NSMutableArray()
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
for: indexPath)
let btn_check : UIButton = cell.viewWithTag(30) as! UIButton
if arr_selected.contains(indexPath.row){
btn_check.isSelected = true
}else{
btn_check.isSelected = false
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
if arr_selected.contains(indexPath.row){
arr_selected.remove(indexPath.row)
}else{
arr_selected.add(indexPath.row)
}
self.collview.reloadData()
}
如果你想要演示,那么你可以从HERE
下载
我正在使用 swift 3,我的应用程序中有集合视图,其中显示 iPhone 画廊。一切都很好但我希望用户可以 select 一些照片,这可能会发生但问题是我在每个单元格中使用了另一个小图像,当用户 select 该单元格时图片将显示用户可以理解该单元格已被 select 编辑的勾号 - 这将在开始时起作用,但是当用户滚动集合视图时,一些用户没有 select 的单元格也有这个勾号! **请记住,select 和 did deselect 运行良好,问题仅在于显示此勾号 ** **我在单元格中有带有标签的图像,当用户 select 单元格或 didDeselect **
时,该图像将显示勾号或不显示任何内容我知道这些代码比你想象的要多但是很多人需要访问所有代码所以你可以在下面看到我的代码
import UIKit
import Photos
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
let arr_img = NSMutableArray()
@IBOutlet var collview: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let allPhotosOptions : PHFetchOptions = PHFetchOptions.init()
allPhotosOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
let allPhotosResult = PHAsset.fetchAssets(with: .image, options: allPhotosOptions)
allPhotosResult.enumerateObjects({ (asset, idx, stop) in
self.arr_img.add(asset)
})
}
func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
let retinaScale = UIScreen.main.scale
let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//CGSizeMake(size * retinaScale, size * retinaScale)
let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
let square = CGRect(x: 0, y: 0, width: cropSizeLength, height: cropSizeLength)//CGRectMake(0, 0, CGFloat(cropSizeLength), CGFloat(cropSizeLength))
let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
var thumbnail = UIImage()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.normalizedCropRect = cropRect
manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//MARK:
//MARK: Collectioview methods
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return arr_img.count
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
for: indexPath)
let imgview : UIImageView = cell.viewWithTag(20) as! UIImageView
imgview.image = self.getAssetThumbnail(asset: self.arr_img.object(at: indexPath.row) as! PHAsset, size: 150)
return cell
}
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
let cell = collectionView.cellForItem(at: indexPath as IndexPath)
if cell!.isSelected == true {
print(indexPath)
cell?.backgroundColor = UIColor.orange
print("Cell is Selected!")
let selectView : UIImageView = cell?.viewWithTag(22) as! UIImageView
selectView.image = UIImage(named: "Select.png")
}
else if cell!.isSelected != true {
collectionView.cellForItem(at: indexPath as IndexPath)
cell?.backgroundColor = UIColor.clear
let selectView : UIImageView = cell?.viewWithTag(22) as! UIImageView
selectView.image = nil
print("Cell is Not Selected!")
}
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath as IndexPath)
print(indexPath)
if cell?.isSelected == true {
cell?.backgroundColor = UIColor.orange
print("Cell is Selected In Deselect!")
let selectView : UIImageView = cell!.viewWithTag(22) as! UIImageView
selectView.image = nil
collectionView.cellForItem(at: indexPath as IndexPath)
}
else if cell?.isSelected != true {
cell?.backgroundColor = UIColor.clear
collectionView.cellForItem(at: indexPath as IndexPath)
print("Cell is DeSelected!")
let selectView : UIImageView = cell!.viewWithTag(22) as! UIImageView
selectView.image = nil
}
}
只需在您的单元格内放置一个按钮并为其添加标签。
获取数组并执行以下操作。
let arr_selected = NSMutableArray()
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
for: indexPath)
let btn_check : UIButton = cell.viewWithTag(30) as! UIButton
if arr_selected.contains(indexPath.row){
btn_check.isSelected = true
}else{
btn_check.isSelected = false
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
if arr_selected.contains(indexPath.row){
arr_selected.remove(indexPath.row)
}else{
arr_selected.add(indexPath.row)
}
self.collview.reloadData()
}
如果你想要演示,那么你可以从HERE
下载