【问题标题】:How to allow the user to pick a photo from his camera roll or photo library?如何允许用户从他的相机胶卷或照片库中挑选照片?
【发布时间】:2011-05-24 12:34:29
【问题描述】:

我正在制作一个有趣的照片编辑应用程序。用户必须从他们的相机胶卷中选择一张照片,然后将其导入以进行修改。

这通常是如何工作的?我见过许多应用程序允许使用看起来始终相同的标准控制器。

是否也可以直接访问该库或自定义该控制器的外观?

我应该从哪里开始寻找?

【问题讨论】:

标签: iphone ios camera


【解决方案1】:

最简单的方法是在简单的 alertView 中使用 UIImagePickerController。

例如,您希望某人点击他们的个人资料照片,并能够从他们的相机或照片库中设置新图像。

@IBAction func btnProfilePicTap(sender: AnyObject) {
    let picker = UIImagePickerController()
    picker.delegate = self
    let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {
        action in
        picker.sourceType = .camera
        self.present(picker, animated: true, completion: nil)
    }))
    alert.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: {
        action in
        picker.sourceType = .photoLibrary
        self.present(picker, animated: true, completion: nil)
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    self.present(alert, animated: true, completion: nil)
}

然后只需添加代理即可。

extension ProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        //use image here!
        dismiss(animated: true, completion: nil)
    }

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

对不起,这个例子很快,但我希望它仍然有帮助。

编辑:为 Swift 5 更新。

【讨论】:

【解决方案2】:

我开发了一个允许用户选择个人图像的应用程序。我有两个 UIButtons 可以帮助用户选择图片,无论是来自相机还是图书馆。是这样的:

- (void)camera {
if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
    return;
}
UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
//Permetto la modifica delle foto
picker.allowsEditing = YES;
//Imposto il delegato
[picker setDelegate:self];

[self presentModalViewController:picker animated:YES];
}
- (void)library {
//Inizializzo la classe per la gestione della libreria immagine
UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//Permetto la modifica delle foto
picker.allowsEditing = YES;
//Imposto il delegato
[picker setDelegate:self];

[self presentModalViewController:picker animated:YES];
}

你必须实现 UIImagePickerControllerDelegate:

@interface PickPictureViewController : UIViewController <UIImagePickerControllerDelegate>

@implementation PickPictureViewController

#pragma mark UIImagePickerController Delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
UIImage *pickedImage = [info objectForKey:UIImagePickerControllerEditedImage];
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
    UIImageWriteToSavedPhotosAlbum(pickedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
[self dismissModalViewControllerAnimated:YES];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[self dismissModalViewControllerAnimated:YES];
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{}

希望对您有所帮助! ;)

【讨论】:

    【解决方案3】:

    此答案仅适用于物理设备!

    访问相机:

    - (void)takePhoto {
    
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    [self presentViewController:picker animated:YES completion:NULL];
    
    }
    

    访问相机胶卷:

    - (void)selectPhoto {
    
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    
    [self presentViewController:picker animated:YES completion:NULL];
    
    
    }
    

    实现 UIImagePickerController 的委托方法:

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    
    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.imageView.image = chosenImage;
    
    [picker dismissViewControllerAnimated:YES completion:NULL];
    
    }
    

    还有这个:

    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    
    [picker dismissViewControllerAnimated:YES completion:NULL];
    
    }
    

    还可以查看link的更多信息

    【讨论】:

      【解决方案4】:

      SWIFT 2.0

      感谢 William T。这对我的 UITapGestureRecognizer 有用

      func selectPhoto(tap: UITapGestureRecognizer) {
          let picker = UIImagePickerController()
          picker.delegate = self
          let alert = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
          alert.addAction(UIAlertAction(title: "Camera", style: .Default, handler: {
              action in
              picker.sourceType = .Camera
              picker.allowsEditing = true
              self.presentViewController(picker, animated: true, completion: nil)
          }))
          alert.addAction(UIAlertAction(title: "Photo Library", style: .Default, handler: {
              action in
              picker.sourceType = .PhotoLibrary
              picker.allowsEditing = true
              self.presentViewController(picker, animated: true, completion: nil)
          }))
          alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
          self.presentViewController(alert, animated: true, completion: nil)
      }
      

      我添加了以下内容,以便在将照片同时选择到 .Camera 和 .PhotoLibrary 后对其进行编辑:

      picker.allowsEditing = true
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          【解决方案6】:

          @WilliamT 的回答对我来说非常有效。这是他的,但已针对 Swift 4 进行了更新,以防有人仍在寻找它。

          这将进入包含您要触发相机/图像选择器的按钮的视图控制器类块。

          @IBAction func YourButtonToTriggerCamera/ImagePicker(_ sender: UIButton) {
              let picker = UIImagePickerController()
              picker.delegate = (self as UIImagePickerControllerDelegate & UINavigationControllerDelegate)
              let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
              alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: {
                  action in
                  picker.sourceType = .camera
                  self.present(picker, animated: true, completion: nil)
              }))
              alert.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: {
                  action in
                  picker.sourceType = .photoLibrary
                  self.present(picker, animated: true, completion: nil)
              }))
              alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
              self.present(alert, animated: true, completion: nil)
          }
          

          这在你的视图控制器类下面:

          extension YourViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
          
              func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
                  //use image here!
                  dismiss(animated: true, completion: nil)
              }
          
              func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
                  dismiss(animated: true, completion: nil)
              }
          }
          

          【讨论】:

            【解决方案7】:

            这是一个示例应用程序和一个包装器,可以像 Facebook 一样为您提供拍照或从库中选择。 https://github.com/fulldecent/FDTake

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-18
              • 2021-01-10
              • 2017-12-06
              • 2016-08-18
              相关资源
              最近更新 更多