简体   繁体   中英

How can I display selected images from the Photo Library or Camera in a CollectionView? Gallery view

everybody, I'm a beginner in Swift and I'm not making any progress at the moment. I have built a view with CollectionView and would like to fill it with pictures from the Photo Library.

Unfortunately I can't create the UIImages as an array and display them in CollectionView.

I can create a single UIImageView and connect it to my vc accordingly and also load an image into the view.

But I don't get it to load several images into the CollectionView.

How can I build my own gallery in which I load pictures from the camera or photo library?

That's my previous code

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {


@IBOutlet weak var myCollectionView: UICollectionView!

let dataArray = ["1", "2", "3", "4", "5"]

override func viewDidLoad() {
    super.viewDidLoad()

    // Set Delegates
    self.myCollectionView.delegate = self
    self.myCollectionView.dataSource = self

}

@IBAction func chooseImage(_ sender: UIBarButtonItem) {
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self

    let actionSheet = UIAlertController(title: "Quelle", message: "Wähle eine Quelle aus", preferredStyle: .actionSheet)

    actionSheet.addAction(UIAlertAction(title: "Kamera", style: .default, handler: { (action:UIAlertAction) in

        if UIImagePickerController.isSourceTypeAvailable(.camera){
            imagePickerController.sourceType = .camera
            self.present(imagePickerController, animated: true, completion: nil)
        } else {
            print("Kamera nicht verfügbar")
        }
    }))

    actionSheet.addAction(UIAlertAction(title: "Foto", style: .default, handler: { (action:UIAlertAction) in
        imagePickerController.sourceType = .photoLibrary
        self.present(imagePickerController, animated: true, completion: nil)
    }))

    actionSheet.addAction(UIAlertAction(title: "Abbrechen", style: .cancel, handler: nil))

    self.present(actionSheet, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
    picker.dismiss(animated: true, completion: nil)
}


func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
}


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return dataArray.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ItemCell", for: indexPath) as! ItemCell
    cell.setData(text: self.dataArray[indexPath.row])
    return cell
}

The cell is implemented as follows.

class ItemCell: UICollectionViewCell {

@IBOutlet weak var textLabel: UILabel!
@IBOutlet weak var imageView: UIImageView!


override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

func setData(text: String) {
    self.textLabel.text = text
}

func setImg(image: UIImage) {
    self.imageView.image = image
}

But now I want to get UIImages instead of the labels "1", "2" and so on and only those I choose myself with the imagePickerController.

If I understand the question, you're nearly there. It would be better if you could be a little more explicit with the question, as I may be wasting my time with the answer.

What I think you want is:

  • Start with an empty gallery
  • When the user selects an image, it is added to the gallery

Your UICollectionViewCell implementation looks ok, so I'll assume it will work.

Try these steps.

Change the declaration of dataArray to

var dataArray: [UIImage] = []

Change the ImagePicker delegate function to:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
    dataArray.append(image)
    picker.dismiss(animated: true, completion: nil)
    self.myCollectionView.insertItems(at: [IndexPath(item: dataArray.count, section: 0)])
}

Change cell.setData to cell.setImg

You may need to work on persisting the images in some way to make this useful.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM