問題環(huán)境:Xcode 8.1 + iOS SDK10.1
首先是調(diào)用之前的iOS10權(quán)根問題,具體問題見:
“This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription(NSPhotoLibraryUsageDescription) key with a string value explaining to the user how the app uses this data.”
以上問題調(diào)用相機和調(diào)用相冊都會遇到,分別在Info.plist中添加Dictionary:
NSCameraUsageDescription(相機),
NSPhotoLibraryUsageDescription(相冊)
第二個先上代碼,我們調(diào)用相冊的通用代碼:
UIImagePickerController* _imagePickerController;
_imagePickerController = [[UIImagePickerController alloc] init];
_imagePickerController.delegate = self;
_imagePickerController.allowsEditing = YES;
_imagePickerController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
_imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
_imagePickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:_imagePickerController.sourceType];
_imagePickerController.allowsEditing = YES;
[self presentViewController:_imagePickerController animated:YES completion:nil];
有一個回調(diào)方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo {
}
想說的是這個方法已經(jīng)被廢棄,調(diào)用不會產(chǎn)生任務(wù)效果,剛開始還糾結(jié)了好久;這里要說一下廢棄的問題:
- (void) application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder NS_AVAILABLE_IOS(6_0);
- @property(nonatomic,getter=isProximitySensingEnabled) BOOL proximitySensingEnabled NS_DEPRECATED_IOS(2_0, 3_0);
這里的NS_AVAILABLE_IOS(6_0) 和 NS_DEPRECATED_IOS(2_0, 3_0) ,
NS_AVAILABEL_IOS(6_0)表示,自IOS6.0開始支持該方法,若在IOS6.0之前的版本使用該函數(shù),則會導(dǎo)致 Crash;
NS_DEPRECATED_IOS(2_0,3_0)表示該函數(shù)只能在IOS2.0 和 IOS3.0之間使用,是已被廢棄的函數(shù),但并不是說在IOS3.0之后不能使用該函數(shù),是可以使用,但也需要考慮找其他替代方法了;現(xiàn)在看來,舊方法不適宜用,因為某些可以蘋果已經(jīng)不再用了;(為什么不用保險的呢?)
另外,還有 NS_DEPRECATED(10_6,10_9,2_0,7_0)這種寫法,為自mac10.6和ios2.0引入,在mac10.9和ios7.0被廢棄
另外,iOS默認不添加回調(diào)的時候相冊圖片選取或者相冊中點取消是返回原先界面的;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
[picker dismissViewControllerAnimated:YES completion:^{}];
NSLog(@"選擇完畢-----info:%@",info);
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:^{}];
}
接下來就是這兩個回調(diào)了,一個選取,一個取消,跳回原來界面的操作需要添加,因為如果實現(xiàn)了這兩個方法,就是處理自己的邏輯了;