Aprendizaje de iOS: llame al álbum del teléfono móvil, expanda: identifique el código QR del álbum

Prefacio: Creo que todos saben que la mayoría de las aplicaciones tienen mi módulo, y mi módulo básicamente tiene información como el avatar del usuario, y el avatar se puede cambiar. Así que hoy les daré una breve introducción sobre cómo llamar a la cámara del sistema para tomar fotos u obtener fotos del álbum en el desarrollo de iOS. Para obtener la cámara del sistema o el álbum de fotos, necesitamos usar la clase UIImagePickerController. Veamos cómo lograrlo:

Primero, debe seguir los dos protocolos del delegado UIImagePickerController: <UIImagePickerControllerDelegate, UINavigationControllerDelegate>. ¿Por qué dos acuerdos? Presiona la tecla de comando y hace clic en el delegado de UIImagePickerController, y encontrará que el delegado realmente cumple con dos protocolos.

#import "HeaderPhotoViewController.h"

@interface HeaderPhotoViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property (nonatomic, strong) UIImageView * imageView;
@end

@implementation HeaderPhotoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @"设置头像";
    self.view.backgroundColor = [UIColor whiteColor];
    
    [self setNavigation];
    [self addSubviews];
    [self makeConstraintsForUI];
}

#pragma mark - set navigation

- (void)setNavigation {
    
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(selectPhoto:)];
}

#pragma mark - navitation item action

- (void)selectPhoto:(UIBarButtonItem *)itemCamera {

    //创建UIImagePickerController对象,并设置代理和可编辑
    UIImagePickerController * imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.editing = YES;
    imagePicker.delegate = self;
    //设置是否可编辑
    imagePicker.allowsEditing = YES;

    //创建sheet提示框,提示选择相机还是相册
    UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"请选择打开方式" message:nil preferredStyle:UIAlertControllerStyleActionSheet];

    //相机选项
    UIAlertAction * camera = [UIAlertAction actionWithTitle:@"相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        //选择相机时,设置UIImagePickerController对象相关属性
        imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;
        imagePicker.modalPresentationStyle = UIModalPresentationFullScreen;
        imagePicker.mediaTypes = @[(NSString *)kUTTypeImage];
        imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
        //跳转到UIImagePickerController控制器弹出相机
        [self presentViewController:imagePicker animated:YES completion:nil];
    }];

    //相册选项
    UIAlertAction * photo = [UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        //选择相册时,设置UIImagePickerController对象相关属性
        imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        //跳转到UIImagePickerController控制器弹出相册
        [self presentViewController:imagePicker animated:YES completion:nil];
    }];

    //取消按钮
    UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }];

    //添加各个按钮事件
    [alert addAction:camera];
    [alert addAction:photo];
    [alert addAction:cancel];

    //弹出sheet提示框
    [self presentViewController:alert animated:YES completion:nil];
}

#pragma mark - add subviews

- (void)addSubviews {
    
    [self.view addSubview:self.imageView];
}

#pragma mark - make constraints

- (void)makeConstraintsForUI {
    
    __weak typeof(self)weakSelf = self;
    
    [_imageView mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.size.mas_equalTo(CGSizeMake(Screen_Width, Screen_Width));
        make.centerX.mas_equalTo(weakSelf.view.mas_centerX);
        make.centerY.mas_equalTo(weakSelf.view.mas_centerY);
    }];
}

#pragma mark - imagePickerController delegate

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    
    [picker dismissViewControllerAnimated:YES completion:nil];
    //获取到的图片
    UIImage * image = [info valueForKey:UIImagePickerControllerEditedImage];
    _imageView.image = image;
}

#pragma mark - setter and getter

- (UIImageView *)imageView {
    
    if (!_imageView) {
        
        _imageView = [[UIImageView alloc] init];
        _imageView.backgroundColor = [UIColor greenColor];
        _imageView.contentMode = UIViewContentModeScaleAspectFill;
    }
    return _imageView;
}

@end

¡DE ACUERDO! Todos los códigos de la demo han sido presentados a todos, el último paso es configurar el archivo plist, no lo olvides o colapsará. Agregue el campo Privacidad - Descripción de uso de la cámara para llamar a la cámara y el campo para llamar al álbum: Privacidad - Descripción de uso de la biblioteca de fotos en el archivo plist. Todo está listo, lo único que falta es un teléfono móvil de Apple para la prueba.La prueba de la cámara debe probarse con un dispositivo real.

Finalmente, espero ayudar a los amigos simios que lo necesitan, y espero que nosotros, que también somos programadores, podamos aprender y progresar juntos, ¡y avanzar más y más en el camino del desarrollo! ¡Gracias!

Expansión: Si desea reconocer el código QR de la imagen seleccionada, debe modificarlo en el agente, el código específico es el siguiente

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    [picker dismissViewControllerAnimated:YES completion:nil];
    //获取到的图片
    UIImage *image = [info valueForKey:UIImagePickerControllerEditedImage];
    // 2、创建 CIImage
    CIImage *ciimage = [[CIImage alloc] initWithImage:image];
    // 3、识别精度
    NSDictionary *options = @{CIDetectorAccuracy: CIDetectorAccuracyHigh};
    // 4、创建识别器
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:options];
    
    NSArray *features = [detector featuresInImage:ciimage];
    
    NSString *message = nil;
    for (CIFeature *item in features) {
        if ([item isKindOfClass:[CIQRCodeFeature class]]) {
            message = [(CIQRCodeFeature *)item messageString];
            NSLog(@"message = %@", message);
            break;
        }
    }
}

Establecer si editar imágenes

BOOL permite la edición

Establezca si saltar al modo de edición para recortar la imagen después de tomar una foto o seleccionar una foto en el álbum, es decir, si desea permitir la edición

Solo funciona cuando showsCameraControls=Yes.

[ImagePicker setAllowsEditing:YES]; 

Para cancelar la edición, configúrelo en NO y cambie el tipo de la imagen obtenida a UIImagePickerControllerOriginalImage

[ImagePicker setAllowsEditing:NO]; 

UIImage * imagen = [info valueForKey:UIImagePickerControllerOriginalImage];

Referencia: Desarrollo de iOS - Cámara del sistema de llamadas y álbum para obtener fotos - Libro breve Conceptos básicos de ios (1) - Programa UIImagePickerController Class_A Blog de Yuan0915-CSDN Blog

Supongo que te gusta

Origin blog.csdn.net/qq_43441647/article/details/130504701
Recomendado
Clasificación