美文网首页
图片选取器UIImagePickerController

图片选取器UIImagePickerController

作者: KardelShaw | 来源:发表于2017-03-02 17:14 被阅读0次
    @interface ViewController () <UIImagePickerControllerDelegate>
    
    @property (nonatomic, strong) UIButton *button;
    
    @property (nonatomic, strong) UIImageView *imageView;
    
    @end
    
    @implementation ViewController 
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        
        [self.view addSubview:self.button];
        
        [self.view addSubview:self.imageView];
        
    
    }
    
    
    
    - (void)toImagePickerController {
    
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
            UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
            ipc.delegate = self;
            
            
            ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            
            [self presentViewController:ipc animated:true completion:nil];
        }
        
        
    }
    
    - (UIButton *)button {
        
        CGRect screen = [[UIScreen mainScreen] bounds];
        
        if (!_button) {
            _button = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 46, 30)];
            
            [_button setTitle:@"图片" forState:UIControlStateNormal];
            [_button setBackgroundColor:[UIColor redColor]];
            
            _button.center = CGPointMake(screen.size.width/2, screen.size.height-100);
            
            [_button addTarget:self action:@selector(toImagePickerController) forControlEvents:UIControlEventTouchUpInside];
            
        }
        return _button;
        
    }
    
    #pragma mark -- 1. UIImagePickerDelegate --
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
        
        self.imageView.image = info[UIImagePickerControllerOriginalImage];
        
        
        [picker dismissViewControllerAnimated:true completion:nil];
    }
    
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
        [picker dismissViewControllerAnimated:true completion:nil];
    }
    
    
    
    
    - (UIImageView *)imageView {
        if (!_imageView) {
            
            _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height/2)];
            
            _imageView.backgroundColor = [UIColor blueColor];
            
        }
        return _imageView;
    
    }
    
    @end
    

    迭代2:添加可以使用摄像头照一张照片以显示出来的功能,两个不同的Button通过使用tag属性,传入toImagePickerController:方法根据它们的tag来确定功能

    @interface ViewController () <UIImagePickerControllerDelegate>
    
    @property (nonatomic, strong) UIButton *button;
    
    @property (nonatomic, strong) UIImageView *imageView;
    
    @property (nonatomic, strong) UIButton *takePhotoButton;
    
    @end
    
    @implementation ViewController 
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        
        [self.view addSubview:self.button];
        
        [self.view addSubview:self.imageView];
        
        [self.view addSubview:self.takePhotoButton];
    }
    
    
    
    - (void)toImagePickerController: (id)sender  {
    
        NSInteger tag = ((UIButton *)sender).tag;
        
        
        
        
        if (tag == 1) {
            
            [self pickMediaFromSource:UIImagePickerControllerSourceTypePhotoLibrary];
            
        } else if (tag == 2) {
    
            [self pickMediaFromSource:UIImagePickerControllerSourceTypeCamera];
            
        }
        
    }
    
    
    - (void)pickMediaFromSource: (UIImagePickerControllerSourceType)sourceType {
        
        NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:sourceType];
        
        if ([UIImagePickerController isSourceTypeAvailable:sourceType] && [mediaTypes count] > 0) {
            UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
            ipc.delegate = self;
            
            ipc.sourceType = sourceType;
            
            ipc.mediaTypes = mediaTypes;
            
            [self presentViewController:ipc animated:true completion:nil];
        } else {
            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"error accessing source." message:@"Unsupported media source." preferredStyle:UIAlertControllerStyleAlert];
            
            UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
            
            [alertController addAction:okAction];
            
            [self presentViewController:alertController animated:true completion:nil];
        }
        
    }
    
    
    #pragma mark -- 1. UIImagePickerDelegate --
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
        
        self.imageView.image = info[UIImagePickerControllerOriginalImage];
        
        
        [picker dismissViewControllerAnimated:true completion:nil];
    }
    
    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
        [picker dismissViewControllerAnimated:true completion:nil];
    }
    
    
    #pragma mark -- 2. imageView getter --
    - (UIImageView *)imageView {
        if (!_imageView) {
            
            _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height/2)];
            
            _imageView.backgroundColor = [UIColor blueColor];
            
        }
        return _imageView;
    
    }
    
    #pragma mark -- 3. button getter --
    - (UIButton *)button {
        
        CGRect screen = [[UIScreen mainScreen] bounds];
        
        if (!_button) {
            _button = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 46, 30)];
            
            [_button setTitle:@"图片" forState:UIControlStateNormal];
            [_button setBackgroundColor:[UIColor redColor]];
            
            _button.center = CGPointMake(screen.size.width/2, screen.size.height-100);
            
            _button.tag = 1;
            
            [_button addTarget:self action:@selector(toImagePickerController:) forControlEvents:UIControlEventTouchUpInside];
            
        }
        return _button;
        
    }
    
    #pragma mark -- 4. takePhotoButton --
    - (UIButton *)takePhotoButton {
        
        CGRect screen = [[UIScreen mainScreen] bounds];
        
        if (!_takePhotoButton) {
            _takePhotoButton  = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 46, 30)];
            
            [_takePhotoButton setTitle:@"照相" forState:UIControlStateNormal];
            [_takePhotoButton setBackgroundColor:[UIColor blueColor]];
            
            _takePhotoButton.center = CGPointMake(screen.size.width/2, screen.size.height-50);
            
            _takePhotoButton.tag = 2;
            
            [_takePhotoButton addTarget:self action:@selector(toImagePickerController:) forControlEvents:UIControlEventTouchUpInside];
        }
        
        return _takePhotoButton;
        
    }
    
    @end
    

    核心代码:

    NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:sourceType];
    
     if ([UIImagePickerController isSourceTypeAvailable:sourceType] && [mediaTypes count] > 0) {
            UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
            ipc.delegate = self;
            
            ipc.sourceType = sourceType;
            
            ipc.mediaTypes = mediaTypes;
            
            [self presentViewController:ipc animated:true completion:nil];
        }
    
    • 第一行的mediaTypes数组获取了当前设备可用的所有媒体类型。
    • 把mediaTypes数组赋值给ipc.mediaTypes,如果当前设备可用相机,那么会省去设置ipc.cameraDevice。兼容了有相机和无相机的设备调用此方法的情况。
    • sourceType中的两个方法易混淆,SavedPhotoAlbum用于无相机的设备

    </br>
    常见问题:

    This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

    这些都涉及隐私,需要访问相册和使用相机都需要先询问用户使用允许这么做,在info.plist文件里添加相关参数即可

    • 访问相册


    • 访问相机


    相关文章

      网友评论

          本文标题:图片选取器UIImagePickerController

          本文链接:https://www.haomeiwen.com/subject/ptzqgttx.html