Accessing picture library in an ActionSheet style
Asked Answered
F

4

6

I'm trying to create a profilePic in a Sign Up View Controller. The profilePic is of type UIImageView. I want to be able to tap it so it instantly pulls up a photo library in an ActionSheet Style. And to also have one of the image box a button to access the camera. Is this possible?

import UIKit

class SignUpViewController: UIViewController, UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var profilePic: UIImageView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        // PROFILE PICTURE

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

        profilePic.addGestureRecognizer(tapGesture)
        profilePic.userInteractionEnabled = true

    }


    func imageTapped(gesture:UIGestureRecognizer) {
        if let profile1Pic = gesture.view as? UIImageView {
            print("Image Tapped")
        }
    }
Flowery answered 17/7, 2015 at 14:1 Comment(0)
A
14

Try this code below :

import UIKit

class SignUpViewController: UIViewController, UIImagePickerControllerDelegate {

@IBOutlet weak var profilePic: UIImageView!


override func viewDidLoad() {
  super.viewDidLoad()

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

  profilePic.addGestureRecognizer(tapGesture)
  profilePic.userInteractionEnabled = true

}


func imageTapped(gesture:UIGestureRecognizer) {
  if let profile1Pic = gesture.view as? UIImageView {
      print("Image Tapped")
      showActionSheet()
  }
}
func camera()
{
    var myPickerController = UIImagePickerController()
    myPickerController.delegate = self;
    myPickerController.sourceType = UIImagePickerControllerSourceType.Camera

    self.presentViewController(myPickerController, animated: true, completion: nil)

}

func photoLibrary()
{

    var myPickerController = UIImagePickerController()
    myPickerController.delegate = self;
    myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

    self.presentViewController(myPickerController, animated: true, completion: nil)

}

func showActionSheet() {
    let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

    actionSheet.addAction(UIAlertAction(title: "Camera", style: UIAlertActionStyle.Default, handler: { (alert:UIAlertAction!) -> Void in
        self.camera()
    }))

    actionSheet.addAction(UIAlertAction(title: "Gallery", style: UIAlertActionStyle.Default, handler: { (alert:UIAlertAction!) -> Void in
        self.photoLibrary()
    }))

    actionSheet.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: nil))

    self.presentViewController(actionSheet, animated: true, completion: nil)

}

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

    profilePic.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.dismissViewControllerAnimated(true, completion: nil)

}
}

Its working on my side..hope will do the some for you !

Acknowledge answered 17/7, 2015 at 14:21 Comment(7)
It works perfectly for me. A great thanks to you. I just had to add UINavigationControllerDelegateFlowery
@MartinQ Welcome and If it is perfect then please mind voting up my answer :)Acknowledge
Apparently, my reputation isn't high enough. I will shortly ... bare with me. And thank you once moreFlowery
how do i enable the allowsEditing mode so the user can zoom in and out to crop the image to a desirable fit? For Instance, in you code above, i added myPickerController.allowsEditing = true in both the photoLibrary function and the camera function and in the func imagePickerController function, i changed the calling of progilePic image action to profilePic.image = info[UIImagePickerControllerEditedImage] as? UIImageFlowery
@MartinQ I haven't tried editing on image. so you can refer this or thisAcknowledge
Thanks for your help. Unfortunately, those links didn't help as much. I will repost with the code as a new question. RegardsFlowery
@MartinQ yeah..you should definitely.Acknowledge
P
5

I recently published a GitHub repository to handle this type of Action Sheet.

You can download this class from here : MSActionSheet

and simply write :

EDIT :

● Now supporting iPad

MSActionSheet(viewController: self, sourceView: sender).showFullActionSheet {
       sender.setImage($0, for: .normal)
}

MSActionSheet

Pointenoire answered 8/4, 2017 at 11:33 Comment(0)
I
2

MSActionSheet : is the best library for set user's profile picture.

  • I used this library but it's not supported in iPad so i customise for some functions for support to iPad and Display with popOverController.

Below the step of customisation.

  1. Replace function with showFullActionSheet

    func showFullActionSheet(on vc : UIViewController, over btn : UIButton,handler : @escaping (_ : UIImage?) -> Void) {
        let sheet = create().addLibrary().addFrontCamera().addRearCamera().addCancelButton()
        sheet.show(on: vc,over: btn){ (image : UIImage?) in
            handler(image)
        }
    }
    
  2. Add code before vc.present(MSActionSheet.sheet!, animated: true, completion: nil) in function show

    if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
            if let presenter = MSActionSheet.sheet?.popoverPresentationController {
                presenter.sourceView = btn
                presenter.sourceRect = btn.bounds
            }
        }
    
  3. Add below code before clientVC?.present(picker, animated: true, completion: nil) in function handler

    if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad {
            picker.modalPresentationStyle = .popover
            if let presenter = picker.popoverPresentationController {
                presenter.sourceView = sourceBtn
                presenter.sourceRect = sourceBtn!.bounds
            }
        }
    

  1. How to use

    let msActionSheet = MSActionSheet.instance
        msActionSheet.showFullActionSheet(on: self,over: btn){ (image) in
            btn.setImage(image, for: .normal)
        }
        msActionSheet.tintColor(color: Constants.kColorBluish)
    
Injun answered 27/4, 2017 at 9:18 Comment(1)
Please check out the new version, supports iPadPointenoire
S
0

Swift 3x:

 class yourClassName:UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate {


 @IBAction func yourButtonName(_ sender: UIButton) {


        let pickerView = UIImagePickerController()
        pickerView.delegate = self
        pickerView.allowsEditing = true


        let actionSheetControllerIOS8: UIAlertController = UIAlertController(title: "Please select", message: nil, preferredStyle: .actionSheet)

        let cancelActionButton: UIAlertAction = UIAlertAction(title: "Cancel", style: .cancel) { action -> Void in
            print("Cancel") //Cancel
        }
        actionSheetControllerIOS8.addAction(cancelActionButton)

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

            print("Take Photo") //Will open Camera
            if UIImagePickerController.isSourceTypeAvailable(.camera) {

                pickerView.sourceType = .camera
                self.present(pickerView, animated: true, completion: { _ in })
            }

        }
        actionSheetControllerIOS8.addAction(saveActionButton)

        let deleteActionButton: UIAlertAction = UIAlertAction(title: "Camera Roll", style: .default) { action -> Void in

            print("Camera Roll") //Will open Gallery

            pickerView.sourceType = .photoLibrary
            self.present(pickerView, animated: true, completion: { _ in })

        }
        actionSheetControllerIOS8.addAction(deleteActionButton)

        let deleteActionButton2: UIAlertAction = UIAlertAction(title: "Import from Facebook", style: .default) { action -> Void in
            print("Import from Facebook")
        }

        actionSheetControllerIOS8.addAction(deleteActionButton2)
        self.present(actionSheetControllerIOS8, animated: true, completion: nil)

    }

// MARK: - UIImagePickerControllerDelegate Methods

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

//print(info)
if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {

    //print(pickedImage)

    yourImageView.contentMode = .scaleAspectFit
    yourImageView.image = pickedImage

}
dismiss(animated: true, completion: nil)
}

}
Schumann answered 2/2, 2017 at 7:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.