Search code examples
swiftuicollectionviewuiimagepickercontrolleruicollectionviewcell

How to add CollectionView custom cell at the end of cell?


I have array of images , that display in collection view , I create a cell for , when I click on last of cell that open image picker. -> selected image can be set in this cell, and automatic add new cell last of this. (I have no idea about this , please help , Thanks)

CollectionView class

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

var imagePicker = UIImagePickerController()
let reuseIdentifier = "cell" // also enter this string as the cell identifier in the storyboard
var items = ["1", "2", "3", "4", "5"]

@IBOutlet var collectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - UICollectionViewDataSource protocol

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

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! MyCollectionViewCell

   // cell.backgroundColor = UIColor.cyanColor()
    cell.btnSelectImage.setTitle(items[indexPath.row], forState: .Normal)
    cell.btnSelectImage.tag = indexPath.row
    cell.btnSelectImage.addTarget(self,action:#selector(buttonClicked),
                     forControlEvents:.TouchUpInside)
    return cell

}

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 0
    {
        // call your alert here
    }
}
func buttonClicked(sender:UIButton)
{
    let alertController: UIAlertController = UIAlertController(title: "Please choose a Picture".localized, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
    let cameraAction = UIAlertAction(title: "Camera".localized, style: UIAlertActionStyle.Default){
        UIAlertAction in
        self.openCamera()
    }
    let gallaryAction = UIAlertAction(title: "Gallery".localized, style: UIAlertActionStyle.Default){
        UIAlertAction in
        self.openGallary()
    }
    let cancelAction = UIAlertAction(title: "Cancel".localized, style: UIAlertActionStyle.Cancel){
        UIAlertAction in
    }
    alertController.addAction(cameraAction)
    alertController.addAction(gallaryAction)
    alertController.addAction(cancelAction)

    if UIDevice.currentDevice().userInterfaceIdiom == .Phone{
        self.presentViewController(alertController, animated: true, completion: nil)
    }
}
//MARK: - UIImagepickercontroller Method  -

func openCamera()
{
    if UIImagePickerController.availableCaptureModesForCameraDevice(.Rear) != nil
    {
        imagePicker.allowsEditing = true
        imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
        imagePicker.showsCameraControls = true
        imagePicker.cameraCaptureMode = .Photo
        imagePicker.takePicture()

        if UIDevice.currentDevice().userInterfaceIdiom == .Phone
        {
            self.presentViewController(imagePicker, animated: true, completion: nil)
        }
    }
    else
    {
        noCamera()
    }
}

func openGallary()
{
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone
    {
       imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        self.presentViewController(imagePicker, animated: true, completion: nil)
       imagePicker.allowsEditing = true
    }
    else
    {
       imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

    }
}
func noCamera()
{
    let alertVC = UIAlertController(title: "ok", message: "Device has no camera".localized, preferredStyle: UIAlertControllerStyle.Alert)
    let okAction = UIAlertAction(title: "OK".localized, style: UIAlertActionStyle.Default, handler: nil)
    alertVC.addAction(okAction)
    presentViewController(alertVC, animated: true, completion: nil)
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
{

    let timestamp = Int(NSDate().timeIntervalSince1970)
    let choosenImage = info[UIImagePickerControllerEditedImage] as! UIImage


    var indexPath = NSIndexPath(forRow: 0, inSection: 0)
    let cell  = collectionView.cellForItemAtIndexPath(indexPath) as! MyCollectionViewCell

    cell.btnSelectImage.setBackgroundImage(choosenImage, forState: .Normal)


    collectionView.reloadData()

    dismissViewControllerAnimated(true, completion: nil)

}
func imagePickerControllerDidCancel(picker: UIImagePickerController)
{
    dismissViewControllerAnimated(true, completion: nil)
} 

}

CollcetionViewCell

class MyCollectionViewCell: UICollectionViewCell
{

 @IBOutlet var btnSelectImage: UIButton!

}

-Create array for images , showing in collectionview


Solution

  • PLEASE EDIT METHODS ONLY AND ADD SOME METHODS:

    var imagePicker = UIImagePickerController()
    var selectedImage : UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePicker.delegate = self
       // Do any additional setup after loading the view, typically from a nib.
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! MyCollectionViewCell
    
        cell.btnSelectImage.setTitle(items[indexPath.row], forState: .Normal)
        cell.btnSelectImage.addTarget(self,action:#selector(buttonClicked),
                     forControlEvents:.TouchUpInside)
    
        cell.btnSelectImage.setBackgroundImage(selectedImage, forState: .Normal)//setBackground image of button
        return cell
    }
    
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
    {
        //because need open imagePicker only last cell
        //IF YOU WANT TO OPEN IMAGEPICKER CLICK ON BUTTON THEN ADD COMMENT BELOW LINE
        if indexPath.row == self.items.count-1 
        {
            self.configuringImagePickerController()
        }
    }
    
    func buttonClicked(sender:UIButton)
    {
       self.configuringImagePickerController()//If you want open imagepicker click on button
    }
    
    func configuringImagePickerController()
    {
        let alertController: UIAlertController = UIAlertController(title: "Please choose a Picture".localized, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)
        let cameraAction = UIAlertAction(title: "Camera".localized, style: UIAlertActionStyle.Default){
            UIAlertAction in
            self.openCamera()
        }
    
        let gallaryAction = UIAlertAction(title: "Gallery".localized, style: UIAlertActionStyle.Default){
            UIAlertAction in
            self.openGallary()
        }
        let cancelAction = UIAlertAction(title: "Cancel".localized, style: UIAlertActionStyle.Cancel){
           UIAlertAction in
        }
        alertController.addAction(cameraAction)
        alertController.addAction(gallaryAction)
        alertController.addAction(cancelAction)
    
        self.presentViewController(alertController, animated: true, completion: nil)
    }
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        selectedImage = info[UIImagePickerControllerEditedImage] as! UIImage
        collectionView.reloadData()
        dismissViewControllerAnimated(true, completion: nil)
    }