Ios 通过编程方式创建的UICollectionView的UICollectionViewCell中的图像在滚动后重叠
在此处输入代码我尝试在swift中以编程方式创建Ios 通过编程方式创建的UICollectionView的UICollectionViewCell中的图像在滚动后重叠,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,在此处输入代码我尝试在swift中以编程方式创建UICollectionView,然后将一些图像添加到UICollectionViewCell。显示器工作正常,但当我向下滚动视图并再次返回时,单元格开始显示彼此重叠的图像(较新的图像与较旧的图像重叠)。我读到观点的循环利用导致了这个问题。我试了很多,但找不到解决办法。 请大家帮我找到解决办法 谢谢 (此代码可以通过添加一些带有名称的图像来运行) // //ViewController1.swift //网格测试 导入UIKit 类ViewCont
UICollectionView
,然后将一些图像添加到UICollectionViewCell
。显示器工作正常,但当我向下滚动视图并再次返回时,单元格开始显示彼此重叠的图像(较新的图像与较旧的图像重叠)。我读到观点的循环利用导致了这个问题。我试了很多,但找不到解决办法。
请大家帮我找到解决办法
谢谢(此代码可以通过添加一些带有名称的图像来运行)
//
//ViewController1.swift
//网格测试
导入UIKit
类ViewController1:UIViewController、UICollectionViewDataSource、UICollectionViewDelegateFlowLayout{
var collectionView:UICollectionView!
变量tapStatusHolderArray:Array=[Bool]()
var cellCaptureArray:Array=[UICollectionViewCell]()
var accountsIdHohderArray:Array=[Int16]()
var accountsNameHolderArray:Array=[String]()
变量providerNameHolderArray:Array=[String]()
var accountStatusHolderArray:Array=[String]()
var accountsImageNameHolder:Array=[String]()
重写func viewDidLoad(){
super.viewDidLoad()
//数据加载器打开
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(100)
accountsNameHolderArray.append(“账户1”)
providerNameHolderArray.append(“twitter”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(101)
accountsNameHolderArray.append(“账户2”)
providerNameHolderArray.append(“facebook”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(102)
accountsNameHolderArray.append(“账户3”)
providerNameHolderArray.append(“linkedin”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(100)
accountsNameHolderArray.append(“账户1”)
providerNameHolderArray.append(“twitter”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(101)
accountsNameHolderArray.append(“账户2”)
providerNameHolderArray.append(“facebook”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(102)
accountsNameHolderArray.append(“账户3”)
providerNameHolderArray.append(“linkedin”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(100)
accountsNameHolderArray.append(“账户1”)
providerNameHolderArray.append(“twitter”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(101)
accountsNameHolderArray.append(“账户2”)
providerNameHolderArray.append(“facebook”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(102)
accountsNameHolderArray.append(“账户3”)
providerNameHolderArray.append(“linkedin”)
accountStatusHolderArray.append(“已启用”)
accountsImageNameHolder.append(“默认用户图像”)
//数据加载器关闭
//加载视图后执行任何其他设置。
let布局:UICollectionViewFlowLayout=UICollectionViewFlowLayout()
layout.sectionInset=UIEDGEINSET(顶部:20,左侧:10,底部:10,右侧:10)
layout.itemSize=CGSize(宽:70,高:70)
collectionView=UICollectionView(帧:CGRect(x:self.view.frame.origin.x,y:self.view.frame.origin.y,宽度:200,高度:200),collectionViewLayout:layout)
collectionView.dataSource=self
collectionView.delegate=self
registerClass(UICollectionViewCell.self,forCellWithReuseIdentifier:“单元格”)
collectionView.backgroundColor=UIColor.whiteColor()
self.view.addSubview(collectionView)
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
/*
//标记:-导航
//在基于故事板的应用程序中,您通常需要在导航之前做一些准备
覆盖函数prepareforsgue(segue:UIStoryboardSegue,sender:AnyObject?){
//使用segue.destinationViewController获取新的视图控制器。
//将选定对象传递给新的视图控制器。
}
*/
func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{
返回self.tapStatusHolderArray.count
}
func collectionView(collectionView:UICollectionView,cellForItemAtIndexPath indexPath:NSIndexPath)->UICollectionViewCell{
让cell:UICollectionViewCell=collectionView.dequeueReusableCellWithReuseIdentifier(“cell”,forIndexPath:indexPath)作为!UICollectionViewCell
cell.backgroundColor=UIColor.yellowColor()
//在此处创建视图
让accountsImageView=UIImageView()
accountsImageView.SetTranslatesAutoResizengMaskintoConstraints(false)
A.
//
// ViewController1.swift
// Gridtest
import UIKit
class ViewController1: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var collectionView: UICollectionView!
var tapStatusHolderArray: Array<Bool> = [Bool]()
var cellCaptureArray: Array<UICollectionViewCell> = [UICollectionViewCell]()
var accountsIdHohderArray: Array<Int16> = [Int16]()
var accountsNameHolderArray: Array<String> = [String]()
var providerNameHolderArray: Array<String> = [String]()
var accountStatusHolderArray: Array<String> = [String]()
var accountsImageNameHolder: Array<String> = [String]()
override func viewDidLoad() {
super.viewDidLoad()
//data loader open
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(100)
accountsNameHolderArray.append("account 1")
providerNameHolderArray.append("twitter")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(101)
accountsNameHolderArray.append("account 2")
providerNameHolderArray.append("facebook")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(102)
accountsNameHolderArray.append("account 3")
providerNameHolderArray.append("linkedin")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(100)
accountsNameHolderArray.append("account 1")
providerNameHolderArray.append("twitter")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(101)
accountsNameHolderArray.append("account 2")
providerNameHolderArray.append("facebook")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(102)
accountsNameHolderArray.append("account 3")
providerNameHolderArray.append("linkedin")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(100)
accountsNameHolderArray.append("account 1")
providerNameHolderArray.append("twitter")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(101)
accountsNameHolderArray.append("account 2")
providerNameHolderArray.append("facebook")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
tapStatusHolderArray.append(false)
accountsIdHohderArray.append(102)
accountsNameHolderArray.append("account 3")
providerNameHolderArray.append("linkedin")
accountStatusHolderArray.append("enabled")
accountsImageNameHolder.append("default_user_image")
//data loader close
// Do any additional setup after loading the view.
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: 70, height: 70)
collectionView = UICollectionView(frame: CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width: 200, height: 200), collectionViewLayout: layout)
collectionView.dataSource = self
collectionView.delegate = self
collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
collectionView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(collectionView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.tapStatusHolderArray.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell: UICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! UICollectionViewCell
cell.backgroundColor = UIColor.yellowColor()
//create views here
let accountsImageView = UIImageView()
accountsImageView.setTranslatesAutoresizingMaskIntoConstraints(false)
accountsImageView.image = UIImage(named: "default_user_image")
//tap listener for the accounts image view
let tapAccountsImageView = UITapGestureRecognizer(target: self, action: Selector("tapGesture:"))
accountsImageView.tag = indexPath.row
accountsImageView.addGestureRecognizer(tapAccountsImageView)
accountsImageView.userInteractionEnabled = true
let providerImageView = UIImageView()
providerImageView.setTranslatesAutoresizingMaskIntoConstraints(false)
providerImageView.image = UIImage(named: translateProviderNameToImageName(providerNameHolderArray[indexPath.row]))
let checkboxImageView = UIImageView()
checkboxImageView.setTranslatesAutoresizingMaskIntoConstraints(false)
checkboxImageView.image = UIImage(named: "checkbox_unchecked")
//tap listener for the checkbox image view
let tapCheckbox = UITapGestureRecognizer(target: self, action: Selector("tapGesture:"))
checkboxImageView.tag = indexPath.row
checkboxImageView.addGestureRecognizer(tapCheckbox)
checkboxImageView.userInteractionEnabled = true
/************************************************************/
//add subviews here
cell.addSubview(accountsImageView)
cell.addSubview(providerImageView)
cell.addSubview(checkboxImageView)
/************************************************************/
//view dictionary
let viewsDictionary = [
"accountsImageView":accountsImageView,
"providerImageView":providerImageView,
"checkboxImageView":checkboxImageView
]
/************************************************************/
//apply size constraints
//accountsImageView
//1
let accountsImageView_constraint_H = NSLayoutConstraint.constraintsWithVisualFormat(
"H:[accountsImageView(50)]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil,
views: viewsDictionary)
let accountsImageView_constraint_V = NSLayoutConstraint.constraintsWithVisualFormat(
"V:[accountsImageView(50)]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil, views: viewsDictionary)
accountsImageView.addConstraints(accountsImageView_constraint_H)
accountsImageView.addConstraints(accountsImageView_constraint_V)
//2
let providerImageView_constraint_H = NSLayoutConstraint.constraintsWithVisualFormat(
"H:[providerImageView(20)]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil,
views: viewsDictionary)
let providerImageView_constraint_V = NSLayoutConstraint.constraintsWithVisualFormat(
"V:[providerImageView(20)]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil, views: viewsDictionary)
providerImageView.addConstraints(providerImageView_constraint_H)
providerImageView.addConstraints(providerImageView_constraint_V)
//3
let checkboxImageView_constraint_H = NSLayoutConstraint.constraintsWithVisualFormat(
"H:[checkboxImageView(20)]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil,
views: viewsDictionary)
let checkboxImageView_constraint_V = NSLayoutConstraint.constraintsWithVisualFormat(
"V:[checkboxImageView(20)]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil, views: viewsDictionary)
checkboxImageView.addConstraints(checkboxImageView_constraint_H)
checkboxImageView.addConstraints(checkboxImageView_constraint_V)
/**************************************************************/
//position constraints
//views
//1
let view_constraint_H = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-[accountsImageView]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil, views: viewsDictionary)
let view_constraint_V = NSLayoutConstraint.constraintsWithVisualFormat(
"V:|-[accountsImageView]",
options: NSLayoutFormatOptions.AlignAllLeading,
metrics: nil, views: viewsDictionary)
cell.addConstraints(view_constraint_H)
cell.addConstraints(view_constraint_V)
//2
let view_constraint_H1 = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-45-[providerImageView]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil, views: viewsDictionary)
let view_constraint_V1 = NSLayoutConstraint.constraintsWithVisualFormat(
"V:[providerImageView]-50-|",
options: NSLayoutFormatOptions.AlignAllLeading,
metrics: nil, views: viewsDictionary)
cell.addConstraints(view_constraint_H1)
cell.addConstraints(view_constraint_V1)
//3
let view_constraint_H2 = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-0-[checkboxImageView]",
options: NSLayoutFormatOptions(rawValue:0),
metrics: nil, views: viewsDictionary)
let view_constraint_V2 = NSLayoutConstraint.constraintsWithVisualFormat(
"V:[checkboxImageView]-5-|",
options: NSLayoutFormatOptions.AlignAllLeading,
metrics: nil, views: viewsDictionary)
cell.addConstraints(view_constraint_H2)
cell.addConstraints(view_constraint_V2)
/***************************************************************/
//set initial status for the cell checkbox
if(tapStatusHolderArray[indexPath.row] == true){
//set the checkbox as checked
checkboxImageView.image = UIImage(named: "checked_checkbox")
}else{
//set checkbox as unchecked
checkboxImageView.image = UIImage(named: "checkbox_unchecked")
}
//load the cell into the array
cellCaptureArray.append(cell)
return cell
}
func tapGesture(sender: UITapGestureRecognizer)
{
/*var index: Int = sender.view!.tag
if(checkedStatusHolderArray[index] == false){
checkedStatusHolderArray[index] = true
(sender.view as! UIImageView).image = UIImage(named: "checked_checkbox")
}else{
checkedStatusHolderArray[index] = false
(sender.view as! UIImageView).image = UIImage(named: "checkbox_unchecked")
}*///old code
/*
this code extracts the index from the tag attached to the sender
In this case the sender could be either the checkboxIV or the accountIV
both have the same tag. The tag is the indexpath.row for the corresponding cell.
The indexpath.row is used to signal the tap gesture recognizer about the view being tapped.
The tap gesture recognizer is asigned to both the views checkboxIV and the accountIV
so that the user can tap on either to allow check and uncheck the checkbox. Both the tap
gestures reconizers do the same function.
The cell inflated are saved inside the checkedStatusHolderArray so that using the index
extracted above we can change the status of the checkboxIV of the corresponding cell.
*/
var index: Int = sender.view!.tag
var cell: UICollectionViewCell = cellCaptureArray[index]
if(tapStatusHolderArray[index] == false){
tapStatusHolderArray[index] = true
let subViews = cell.subviews
//assuming that the order in which the views were added will be maintained
let checkboxIV = subViews[3] as! UIImageView
checkboxIV.image = UIImage(named: "checked_checkbox")
}else{
tapStatusHolderArray[index] = false
let subViews = cell.subviews
//assuming that the order in which the views were added will be maintained
let checkboxIV = subViews[3] as! UIImageView
checkboxIV.image = UIImage(named: "checkbox_unchecked")
}
/*the reson for choosing [3] for the subvies is that at
index 0 the superview is present
index 1 the accountsImageView is present
index 2 the providerImageView is present
index 3 the checkboxImageView is present*/
}
func translateProviderNameToImageName(var provider: String) -> String{
switch provider{
case "twitter":
return "twitter_transparent"
case "facebook":
return "facebook_transparent"
case "linkedin":
return "linkedin-follow"
default:
return "twitter_transparent"
}
}
}
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.imageView.image = nil;
cell.imageView.image = [UIImage imagewithNamed:@"imagename"];