Как позволить пользователю выбрать фотографию из своей фотопленки или библиотеки фотографий? - PullRequest
12 голосов
/ 24 мая 2011

Я делаю небольшое приложение для редактирования фотографий для удовольствия. Пользователи должны выбрать фотографию из своей фотопленки, которая затем будет импортирована для модификации.

Как это обычно работает? Я видел много приложений, позволяющих это с помощью стандартного контроллера, который всегда выглядит одинаково.

Возможно ли получить прямой доступ к этой библиотеке или настроить внешний вид этого контроллера?

С чего мне начать искать?

Ответы [ 7 ]

21 голосов
/ 17 августа 2015

Самый простой способ сделать это - использовать UIImagePickerController в простом alertView.

Например, вы хотите, чтобы кто-то коснулся изображения своего профиля и мог установить новое изображение с камеры или из библиотеки фотографий.

enter image description here

@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.presentViewController(picker, animated: true, completion: nil)
    }))
    alert.addAction(UIAlertAction(title: "Photo Library", style: .Default, handler: {
        action in
        picker.sourceType = .PhotoLibrary
        self.presentViewController(picker, animated: true, completion: nil)
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)
}

Затем просто добавьте делегата, и все готово.

extension ProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        //use image here!
        dismissViewControllerAnimated(true, completion: nil)
    }

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

}

Извините, этот пример работает быстро, но я надеюсь, что он все еще помогает.

9 голосов
/ 24 мая 2011

Я работал над приложением, которое позволяет пользователю выбирать личное изображение. У меня было две кнопки UIB, которые могли помочь пользователю выбрать изображение, будь то с камеры или из библиотеки. Это примерно так:

- (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{}

Надеюсь, это поможет! ;)

6 голосов
/ 31 марта 2016

Этот ответ актуален ТОЛЬКО для физического устройства!

Камера доступа:

- (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];

}

Также проверьте дополнительную информацию по этой ссылке

5 голосов
/ 11 июня 2016

SWIFT 2.0

Благодаря Уильяму Т. это сработало для меня на моем 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
2 голосов
/ 24 мая 2011

Взгляните на UIImagePickerController

1 голос
/ 14 января 2018

@ Ответ Уильяма мне очень помог.Вот его, но обновленный для 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)
    }
}
1 голос
/ 15 августа 2012

Вот пример приложения и оболочки, которая дает вам сделать фотографию или выбрать из библиотеки, как это делает Facebook.https://github.com/fulldecent/FDTake

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...