Добавить UIImage в массив, используя для цикла

В настоящее время я работаю над приложением, которое позволяет пользователю делать несколько изображений, и оно будет отображаться на iCarousel. Я не очень силен в стремительности, поэтому я не знаю, как это сделать. У меня вопрос: "Как добавить и отобразить изображение после того, как пользователь сделал фотографию?" Я разрешаю максимум 3 фотографии. Вот мои коды ниже:

var imageArray : NSMutableArray = NSMutableArray()

@IBOutlet weak var displayView: iCarousel!

override func viewDidLoad() {
    super.viewDidLoad()

    imageArray = ["1.jpg", "2.jpg", "3.jpg"]

    displayView.type = iCarouselType.coverFlow2

    displayView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}


func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {

    var imgView : UIImageView!

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(imageTapped))

    //let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.imageTapped(_:)))

    if view == nil {
        imgView = UIImageView(frame: CGRect(x: 0, y:0, width: 250, height: 250))
        imgView.contentMode = .scaleAspectFit
    }
    else
    {
        imgView = view as! UIImageView
    }

    imgView.image = UIImage(named:"\(imageArray.object(at: index))")

    imgView.addGestureRecognizer(tapGesture)

    tapGesture.numberOfTapsRequired = 1

    imgView.isUserInteractionEnabled = true

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            imgView.contentMode = .scaleToFill
            imgView.image = pickedImage
        }
        picker.dismiss(animated: true, completion: nil)
    }

    return imgView
}

func carousel(_ carousel: iCarousel, valueFor option: iCarouselOption, withDefault value: CGFloat) -> CGFloat {

    if (option == .spacing)
    {
        return value * 1.8
    }
    return value
}

func numberOfItems(in carousel: iCarousel) -> Int {
    return imageArray.count
}

func imageTapped(_ sender: UITapGestureRecognizer)
{
    let alert = UIAlertController(title: "Pick Image Source", message: "", preferredStyle: .alert)

    let takePhotoBtn = UIAlertAction(title: "Take Photo", style: .default, handler: {(_ action: UIAlertAction) -> Void in

        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.camera
            imagePicker.allowsEditing = false
            self.present(imagePicker, animated: true, completion: nil)
        }
    })

    let galleryBtn = UIAlertAction(title: "Select from Gallery", style: .default, handler: {(_ action: UIAlertAction) -> Void in

        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary)
        {
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
            imagePicker.allowsEditing = false
            self.present(imagePicker, animated: true, completion: nil)
            imagePicker.mediaTypes = ["public.image", "public.movie"] //Remove public.movie later
        }
    })

    let cancelBtn = UIAlertAction(title: "Cancel", style: .default, handler: {(_ action: UIAlertAction) -> Void in
        // print("Cancel")
    })

    alert.addAction(takePhotoBtn)
    alert.addAction(galleryBtn)
    alert.addAction(cancelBtn)

    present(alert, animated: true, completion: { _ in })
}

2 ответа

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
 if imageArray.count == 3{
    return //you can jump to Show the Carousel here
 }
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imgView.contentMode = .scaleToFill
        imgView.image = pickedImage
       // Add image to Array Here
       imageArray.add(image)

    }
  // you can also show refresh carousel from here so new image is availabe in carousel
    picker.dismiss(animated: true, completion: nil)

}

если вы разрешаете максимум 3 изображения, вы также можете записать условие проверки в imageTapped функция.

Пожалуйста, проверьте ниже код:

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,iCarouselDelegate,iCarouselDataSource {

    var imageArray : NSMutableArray = NSMutableArray()
    var selectedImageView : UIImageView! = nil

    @IBOutlet weak var displayView: iCarousel!

    override func viewDidLoad() {
        super.viewDidLoad()

        for i in 1...3
        {
            var imgView : UIImageView!
            imgView = UIImageView(frame: CGRect(x: 0, y:0, width: 250, height: 250))
            imgView.contentMode = .scaleAspectFit
            imgView.tag = i
            imgView.image = UIImage(named: "\(i).png")
            imgView.backgroundColor = UIColor.gray
            imageArray.add(imgView)
        }

        displayView.type = iCarouselType.coverFlow2
        displayView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }


    func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {

        var imgView : UIImageView!

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(imageTapped))


        imgView = imageArray.object(at: index) as? UIImageView

        imgView.addGestureRecognizer(tapGesture)

        tapGesture.numberOfTapsRequired = 1

        imgView.isUserInteractionEnabled = true

        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
            if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                imgView.contentMode = .scaleToFill
                imgView.image = pickedImage
            }
            picker.dismiss(animated: true, completion: nil)
        }

        return imgView
    }

    func carousel(_ carousel: iCarousel, valueFor option: iCarouselOption, withDefault value: CGFloat) -> CGFloat {

        if (option == .spacing)
        {
            return value * 1.8
        }
        return value
    }

    func numberOfItems(in carousel: iCarousel) -> Int {
        return imageArray.count
    }

    func imageTapped(_ sender: UITapGestureRecognizer)
    {

        self.selectedImageView = sender.view as? UIImageView

        let alert = UIAlertController(title: "Pick Image Source", message: "", preferredStyle: .alert)

        let takePhotoBtn = UIAlertAction(title: "Take Photo", style: .default, handler: {(_ action: UIAlertAction) -> Void in

            if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
                let imagePicker = UIImagePickerController()
                imagePicker.delegate = self
                imagePicker.sourceType = UIImagePickerControllerSourceType.camera
                imagePicker.allowsEditing = false
                self.present(imagePicker, animated: true, completion: nil)
            }
        })

        let galleryBtn = UIAlertAction(title: "Select from Gallery", style: .default, handler: {(_ action: UIAlertAction) -> Void in

            if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary)
            {
                let imagePicker = UIImagePickerController()
                imagePicker.delegate = self
                imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
                imagePicker.allowsEditing = false
                self.present(imagePicker, animated: true, completion: nil)
            }
        })

        let cancelBtn = UIAlertAction(title: "Cancel", style: .default, handler: {(_ action: UIAlertAction) -> Void in
            // print("Cancel")
        })

        alert.addAction(takePhotoBtn)
        alert.addAction(galleryBtn)
        alert.addAction(cancelBtn)

        present(alert, animated: true, completion: { _ in })
    }

     public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
    {
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage

        self.selectedImageView.image = chosenImage

        imageArray.replaceObject(at: self.selectedImageView.tag-1, with: self.selectedImageView)


        displayView.reloadData()

        dismiss(animated:true, completion: nil)
    }

}
Другие вопросы по тегам