Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过编程方式创建的UICollectionView的UICollectionViewCell中的图像在滚动后重叠_Ios_Swift_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios 通过编程方式创建的UICollectionView的UICollectionViewCell中的图像在滚动后重叠

Ios 通过编程方式创建的UICollectionView的UICollectionViewCell中的图像在滚动后重叠,ios,swift,uicollectionview,uicollectionviewcell,Ios,Swift,Uicollectionview,Uicollectionviewcell,在此处输入代码我尝试在swift中以编程方式创建UICollectionView,然后将一些图像添加到UICollectionViewCell。显示器工作正常,但当我向下滚动视图并再次返回时,单元格开始显示彼此重叠的图像(较新的图像与较旧的图像重叠)。我读到观点的循环利用导致了这个问题。我试了很多,但找不到解决办法。 请大家帮我找到解决办法 谢谢 (此代码可以通过添加一些带有名称的图像来运行) // //ViewController1.swift //网格测试 导入UIKit 类ViewCont

在此处输入代码我尝试在swift中以编程方式创建
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"];