@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文件里添加相关参数即可
-
访问相册
-
访问相机
网友评论