Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Set a specific Image to a specific array position?

Tags:

ios

swift

I am using a UICollectionView for Horizontal scrolling having six images in the array. What I want is when an item at index path x(1) is clicked an array with images to be set on remaining items(0,2,3,4,5) except position 1. Can we set a specific image at a specific position of an array if yes then how?

In the case of Android, it is like

if (selectedPosition < 0) {
  viewHolder.imageView.setImageResource(coloredSmiley[position]);
} else {
  viewHolder.imageView.setImageResource(selectedPosition == position ? coloredSmiley[position] : greySmiley[position]);
}


import UIKit

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    var selectedImageButton = -1
    var imagearray = ["AngrysmIcon1", "UpsetsmIcon2", "ConfusedsmIcon3", "MehsmIcon4", "CurioussmIcon5" , "HappysmIcon6"]
    var bwimagearray = ["AngrysmIcon1Inactive", "UpsetsmIcon2Inactive", "ConfusedsmIcon3Inactive", "MehsmIcon4Inactive", "CurioussmIcon5Inactive", "HappysmIcon6Inactive"]

    var positiontag = ["0", "1", "2", "3", "4", "5"]

    override func viewDidLoad() {
        super.viewDidLoad()

        }

  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

            return self.positiontag.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! UIcollectionViewCellCollectionViewCell
            cell.imagev.image = UIImage(named: imagearray[indexPath.row])
            return cell

    }
    func numberOfSections(in collectionView: UICollectionView) -> Int {
            return 1
    }

    internal func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)   {

        selectedImageButton = indexPath.row

        let cell = collectionView.cellForItem(at: indexPath) as! UIcollectionViewCellCollectionViewCell
        if selectedImageButton < 0 {

            //cell.imagev.image = bwimagearray[indexPath.row]

        } else {
            cell.imagev.image = UIImage(named: imagearray[indexPath.row])

        } 
    }
}

Where selectedposition is global with value -1

like image 288
Nishant Pathania Avatar asked Mar 26 '26 08:03

Nishant Pathania


2 Answers

From the Android snippet, i believe you need to change cellForRowAt as below,

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! UIcollectionViewCellCollectionViewCell
      let imageName: String
      if selectedImageButton < 0 {
          imageName = imagearray[indexPath.row]
      } else {
          imageName = selectedImageButton == indexPath.row ? imagearray[indexPath.row] : bwimagearray[indexPath.row]
      }
      cell.imagev.image = UIImage(named: imageName)
      return cell

}

And then set the selectedImageButton in didSelectItemAt and reload the collectionView,

internal func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)   {
        selectedImageButton = indexPath.row
        collectionView.reloadData()
}

Note: ReloadData may not be recommended and you should look for some more reactive way to notify the cells to update image.

like image 57
Kamran Avatar answered Mar 27 '26 21:03

Kamran


Add this to cellForItemAt

if cell.isSelected {
    cell.imagev.image = UIImage(named: imagearray[indexPath.row])
} else {
    cell.imagev.image = UIImage(named: bwimagearray[indexPath.row])
}

and following to didSelectItemAt

collectionView.reloadData()

But would recommend to move the logic that set all this to cell something like below mentioned

class UIcollectionViewCellCollectionViewCell: UICollectionViewCell {
    override var isSelected: Bool {
        get {
            return super.isSelected
        }
        set {
            super.isSelected = newValue
            updateImage()
        }
    }

    private func updateImage() {
        if isSelected {
            imagev.image = UIImage(named: imagearray[indexPath.row])
        } else {
            imagev.image = UIImage(named: bwimagearray[indexPath.row])
        }
    }
}
like image 21
Satish Avatar answered Mar 27 '26 20:03

Satish



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!