Commit 69ea2ec4 authored by 少言's avatar 少言

0.1.1-新增base64-新增删除缓存方法

parent 1ef430dc
...@@ -3,7 +3,9 @@ package com.reactlibrary; ...@@ -3,7 +3,9 @@ package com.reactlibrary;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.util.Base64;
import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.BaseActivityEventListener; import com.facebook.react.bridge.BaseActivityEventListener;
...@@ -18,11 +20,12 @@ import com.facebook.react.bridge.WritableMap; ...@@ -18,11 +20,12 @@ import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableNativeArray;
import com.facebook.react.bridge.WritableNativeMap; import com.facebook.react.bridge.WritableNativeMap;
import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.compress.Luban;
import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.tools.PictureFileUtils;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -70,10 +73,18 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule { ...@@ -70,10 +73,18 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule {
this.openCamera(options); this.openCamera(options);
} }
/**
* 缓存清除
* 包括裁剪和压缩后的缓存,要在上传成功后调用,注意:需要系统sd卡权限
*/
@ReactMethod
public void deleteCache() {
Activity currentActivity = getCurrentActivity();
PictureFileUtils.deleteCacheDirFile(currentActivity);
}
/** /**
* 打开相册选择 * 打开相册选择
*
* @param options 相册参数 * @param options 相册参数
*/ */
private void openImagePicker(ReadableMap options) { private void openImagePicker(ReadableMap options) {
...@@ -132,9 +143,8 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule { ...@@ -132,9 +143,8 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule {
} }
/** /**
* 打开相册选择 * 打开相机
* * @param options
* @param options 相册参数
*/ */
private void openCamera(ReadableMap options) { private void openCamera(ReadableMap options) {
boolean isCrop = options.getBoolean("isCrop"); boolean isCrop = options.getBoolean("isCrop");
...@@ -179,6 +189,7 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule { ...@@ -179,6 +189,7 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule {
WritableMap aImage = new WritableNativeMap(); WritableMap aImage = new WritableNativeMap();
BitmapFactory.Options options = new BitmapFactory.Options(); BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; options.inJustDecodeBounds = true;
if (!media.isCompressed()) { if (!media.isCompressed()) {
BitmapFactory.decodeFile(media.getPath(), options); BitmapFactory.decodeFile(media.getPath(), options);
...@@ -186,6 +197,18 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule { ...@@ -186,6 +197,18 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule {
aImage.putDouble("height", options.outHeight); aImage.putDouble("height", options.outHeight);
aImage.putString("type", "image"); aImage.putString("type", "image");
aImage.putString("uri", "file://" + media.getPath()); aImage.putString("uri", "file://" + media.getPath());
//decode to bitmap
Bitmap bitmap = BitmapFactory.decodeFile(media.getPath());
//convert to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
//base64 encode
byte[] encode = Base64.encode(bytes,Base64.DEFAULT);
String encodeString = new String(encode);
aImage.putString("base64", encodeString);
} else { } else {
// 压缩过,取 media.getCompressPath(); // 压缩过,取 media.getCompressPath();
BitmapFactory.decodeFile(media.getCompressPath(), options); BitmapFactory.decodeFile(media.getCompressPath(), options);
...@@ -193,6 +216,17 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule { ...@@ -193,6 +216,17 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule {
aImage.putDouble("height", options.outHeight); aImage.putDouble("height", options.outHeight);
aImage.putString("type", "image"); aImage.putString("type", "image");
aImage.putString("uri", "file://" + media.getCompressPath()); aImage.putString("uri", "file://" + media.getCompressPath());
//decode to bitmap
Bitmap bitmap = BitmapFactory.decodeFile(media.getCompressPath());
//convert to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
//base64 encode
byte[] encode = Base64.encode(bytes,Base64.DEFAULT);
String encodeString = new String(encode);
aImage.putString("base64", encodeString);
} }
if (media.isCut()) { if (media.isCut()) {
...@@ -214,7 +248,6 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule { ...@@ -214,7 +248,6 @@ public class RNSyanImagePickerModule extends ReactContextBaseJavaModule {
/** /**
* 选择照片成功时触发 * 选择照片成功时触发
*
* @param imageList 图片数组 * @param imageList 图片数组
*/ */
private void invokeSuccessWithResult(WritableArray imageList) { private void invokeSuccessWithResult(WritableArray imageList) {
......
...@@ -95,5 +95,12 @@ export default { ...@@ -95,5 +95,12 @@ export default {
...options ...options
}; };
RNSyanImagePicker.openCamera(optionObj, callback) RNSyanImagePicker.openCamera(optionObj, callback)
},
/**
* 清除缓存
*/
deleteCache() {
RNSyanImagePicker.deleteCache()
} }
}; };
...@@ -9,9 +9,7 @@ ...@@ -9,9 +9,7 @@
@interface RNSyanImagePicker () @interface RNSyanImagePicker ()
@property (nonatomic, strong) UIImagePickerController *imagePickerVc; @property (nonatomic, strong) UIImagePickerController *imagePickerVc;
@property (nonatomic, strong) NSDictionary *cameraOptions; @property (nonatomic, strong) NSDictionary *cameraOptions;
/** /**
保存Promise的resolve block 保存Promise的resolve block
*/ */
...@@ -30,14 +28,6 @@ ...@@ -30,14 +28,6 @@
RCT_EXPORT_MODULE() RCT_EXPORT_MODULE()
- (UIImagePickerController *)imagePickerVc {
if (_imagePickerVc == nil) {
_imagePickerVc = [[UIImagePickerController alloc] init];
_imagePickerVc.delegate = self;
}
return _imagePickerVc;
}
RCT_EXPORT_METHOD(showImagePicker:(NSDictionary *)options RCT_EXPORT_METHOD(showImagePicker:(NSDictionary *)options
callback:(RCTResponseSenderBlock)callback) { callback:(RCTResponseSenderBlock)callback) {
self.callback = callback; self.callback = callback;
...@@ -56,6 +46,20 @@ RCT_REMAP_METHOD(asyncShowImagePicker, ...@@ -56,6 +46,20 @@ RCT_REMAP_METHOD(asyncShowImagePicker,
[self openImagePickerWithOptions:options]; [self openImagePickerWithOptions:options];
} }
RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSenderBlock)callback) {
self.cameraOptions = options;
self.callback = callback;
self.resolveBlock = nil;
self.rejectBlock = nil;
[self takePhoto];
}
RCT_EXPORT_METHOD(deleteCache) {
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath: [NSString stringWithFormat:@"%@ImageCaches", NSTemporaryDirectory()] error:nil];
}
- (void)openImagePickerWithOptions:(NSDictionary *)options { - (void)openImagePickerWithOptions:(NSDictionary *)options {
// 照片最大可选张数 // 照片最大可选张数
NSInteger imageCount = [options sy_integerForKey:@"imageCount"]; NSInteger imageCount = [options sy_integerForKey:@"imageCount"];
...@@ -67,7 +71,7 @@ RCT_REMAP_METHOD(asyncShowImagePicker, ...@@ -67,7 +71,7 @@ RCT_REMAP_METHOD(asyncShowImagePicker,
NSInteger CropW = [options sy_integerForKey:@"CropW"]; NSInteger CropW = [options sy_integerForKey:@"CropW"];
NSInteger CropH = [options sy_integerForKey:@"CropH"]; NSInteger CropH = [options sy_integerForKey:@"CropH"];
NSInteger circleCropRadius = [options sy_integerForKey:@"circleCropRadius"]; NSInteger circleCropRadius = [options sy_integerForKey:@"circleCropRadius"];
NSInteger quality = [options sy_integerForKey:@"quality"]; NSInteger quality = [self.cameraOptions sy_integerForKey:@"quality"];
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:imageCount delegate:nil]; TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:imageCount delegate:nil];
...@@ -99,21 +103,14 @@ RCT_REMAP_METHOD(asyncShowImagePicker, ...@@ -99,21 +103,14 @@ RCT_REMAP_METHOD(asyncShowImagePicker,
[imagePickerVc setDidFinishPickingPhotosWithInfosHandle:^(NSArray<UIImage *> *photos,NSArray *assets,BOOL isSelectOriginalPhoto,NSArray<NSDictionary *> *infos) { [imagePickerVc setDidFinishPickingPhotosWithInfosHandle:^(NSArray<UIImage *> *photos,NSArray *assets,BOOL isSelectOriginalPhoto,NSArray<NSDictionary *> *infos) {
NSMutableArray *selectedPhotos = [NSMutableArray array]; NSMutableArray *selectedPhotos = [NSMutableArray array];
[weakPicker showProgressHUD]; [weakPicker showProgressHUD];
if (imageCount == 1 && isCrop) { if (imageCount == 1 && isCrop) {
[selectedPhotos addObject:[self handleImageData:photos[0] quality:quality]]; [selectedPhotos addObject:[self handleImageData:photos[0] quality:quality]];
} else { } else {
[infos enumerateObjectsUsingBlock:^(NSDictionary * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { [infos enumerateObjectsUsingBlock:^(NSDictionary * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[selectedPhotos addObject:[self handleImageData:photos[idx] quality:quality]]; [selectedPhotos addObject:[self handleImageData:photos[idx] quality:quality]];
}]; }];
} }
[self invokeSuccessWithResult:selectedPhotos]; [self invokeSuccessWithResult:selectedPhotos];
[weakPicker hideProgressHUD]; [weakPicker hideProgressHUD];
}]; }];
...@@ -124,17 +121,15 @@ RCT_REMAP_METHOD(asyncShowImagePicker, ...@@ -124,17 +121,15 @@ RCT_REMAP_METHOD(asyncShowImagePicker,
[[self topViewController] presentViewController:imagePickerVc animated:YES completion:nil]; [[self topViewController] presentViewController:imagePickerVc animated:YES completion:nil];
} }
RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSenderBlock)callback) { - (UIImagePickerController *)imagePickerVc {
self.cameraOptions = options; if (_imagePickerVc == nil) {
_imagePickerVc = [[UIImagePickerController alloc] init];
self.callback = callback; _imagePickerVc.delegate = self;
self.resolveBlock = nil; }
self.rejectBlock = nil; return _imagePickerVc;
[self takePhoto];
} }
#pragma mark - UIImagePickerController #pragma mark - UIImagePickerController
- (void)takePhoto { - (void)takePhoto {
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if ((authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied) && iOS7Later) { if ((authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied) && iOS7Later) {
...@@ -179,7 +174,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -179,7 +174,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
// 调用相机 // 调用相机
- (void)pushImagePickerController { - (void)pushImagePickerController {
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
self.imagePickerVc.sourceType = sourceType; self.imagePickerVc.sourceType = sourceType;
...@@ -187,7 +181,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -187,7 +181,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
self.imagePickerVc.modalPresentationStyle = UIModalPresentationOverCurrentContext; self.imagePickerVc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
} }
[[self topViewController] presentViewController:self.imagePickerVc animated:YES completion:nil]; [[self topViewController] presentViewController:self.imagePickerVc animated:YES completion:nil];
} else { } else {
NSLog(@"模拟器中无法打开照相机,请在真机中使用"); NSLog(@"模拟器中无法打开照相机,请在真机中使用");
} }
...@@ -209,12 +202,11 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -209,12 +202,11 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
[tzImagePickerVc hideProgressHUD]; [tzImagePickerVc hideProgressHUD];
NSLog(@"图片保存失败 %@",error); NSLog(@"图片保存失败 %@",error);
} else { } else {
[[TZImageManager manager] getCameraRollAlbum:NO allowPickingImage:YES completion:^(TZAlbumModel *model) { [[TZImageManager manager] getCameraRollAlbum:NO allowPickingImage:YES needFetchAssets:YES completion:^(TZAlbumModel *model) {
[[TZImageManager manager] getAssetsFromFetchResult:model.result allowPickingVideo:NO allowPickingImage:YES completion:^(NSArray<TZAssetModel *> *models) { [[TZImageManager manager] getAssetsFromFetchResult:model.result allowPickingVideo:NO allowPickingImage:YES completion:^(NSArray<TZAssetModel *> *models) {
[tzImagePickerVc hideProgressHUD]; [tzImagePickerVc hideProgressHUD];
TZAssetModel *assetModel = [models firstObject]; TZAssetModel *assetModel = [models firstObject];
BOOL isCrop = [self.cameraOptions sy_boolForKey:@"isCrop"]; BOOL isCrop = [self.cameraOptions sy_boolForKey:@"isCrop"];
BOOL showCropCircle = [self.cameraOptions sy_boolForKey:@"showCropCircle"]; BOOL showCropCircle = [self.cameraOptions sy_boolForKey:@"showCropCircle"];
NSInteger CropW = [self.cameraOptions sy_integerForKey:@"CropW"]; NSInteger CropW = [self.cameraOptions sy_integerForKey:@"CropW"];
...@@ -226,7 +218,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -226,7 +218,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initCropTypeWithAsset:assetModel.asset photo:image completion:^(UIImage *cropImage, id asset) { TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initCropTypeWithAsset:assetModel.asset photo:image completion:^(UIImage *cropImage, id asset) {
[self invokeSuccessWithResult:@[[self handleImageData:cropImage quality:quality]]]; [self invokeSuccessWithResult:@[[self handleImageData:cropImage quality:quality]]];
}]; }];
imagePicker.allowCrop = isCrop; // 裁剪 imagePicker.allowCrop = isCrop; // 裁剪
if(showCropCircle) { if(showCropCircle) {
imagePicker.needCircleCrop = showCropCircle; //圆形裁剪 imagePicker.needCircleCrop = showCropCircle; //圆形裁剪
...@@ -236,12 +227,10 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -236,12 +227,10 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
CGFloat y = ([[UIScreen mainScreen] bounds].size.height - CropH) / 2; CGFloat y = ([[UIScreen mainScreen] bounds].size.height - CropH) / 2;
imagePicker.cropRect = CGRectMake(x,y,CropW,CropH); imagePicker.cropRect = CGRectMake(x,y,CropW,CropH);
} }
[[self topViewController] presentViewController:imagePicker animated:YES completion:nil]; [[self topViewController] presentViewController:imagePicker animated:YES completion:nil];
} else { } else {
[self invokeSuccessWithResult:@[[self handleImageData:image quality:quality]]]; [self invokeSuccessWithResult:@[[self handleImageData:image quality:quality]]];
} }
}]; }];
}]; }];
} }
...@@ -257,7 +246,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -257,7 +246,6 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
} }
#pragma mark - UIAlertViewDelegate #pragma mark - UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 1) { // 去设置界面,开启相机访问权限 if (buttonIndex == 1) { // 去设置界面,开启相机访问权限
if (iOS8Later) { if (iOS8Later) {
...@@ -273,13 +261,16 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -273,13 +261,16 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
photo[@"height"] = @(image.size.height); photo[@"height"] = @(image.size.height);
NSString *fileName = [NSString stringWithFormat:@"%@.jpg", [[NSUUID UUID] UUIDString]]; NSString *fileName = [NSString stringWithFormat:@"%@.jpg", [[NSUUID UUID] UUIDString]];
NSString *filePath = [NSString stringWithFormat:@"%@/tmp/%@", NSHomeDirectory(), fileName]; [self createDir];
NSString *filePath = [NSString stringWithFormat:@"%@ImageCaches/%@", NSTemporaryDirectory(), fileName];
if ([UIImageJPEGRepresentation(image, quality/100) writeToFile:filePath atomically:YES]) { if ([UIImageJPEGRepresentation(image, quality/100) writeToFile:filePath atomically:YES]) {
photo[@"uri"] = filePath; photo[@"uri"] = filePath;
} else { } else {
NSLog(@"保存压缩图片失败"); NSLog(@"保存压缩图片失败%@", filePath);
} }
NSData *data = UIImageJPEGRepresentation(image, quality/100);
NSString *dataString = [data base64EncodedStringWithOptions:0]; // base64 encoded image string
photo[@"base64"] = dataString;
return photo; return photo;
} }
...@@ -305,14 +296,23 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender ...@@ -305,14 +296,23 @@ RCT_EXPORT_METHOD(openCamera:(NSDictionary *)options callback:(RCTResponseSender
} }
} }
- (BOOL)createDir {
NSString * path = [NSString stringWithFormat:@"%@ImageCaches", NSTemporaryDirectory()];;
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDir;
if (![fileManager fileExistsAtPath:path isDirectory:&isDir]) {//先判断目录是否存在,不存在才创建
BOOL res=[fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
return res;
} else return NO;
}
- (UIViewController *)topViewController { - (UIViewController *)topViewController {
// UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; // UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
UIViewController *rootViewController = RCTPresentedViewController(); UIViewController *rootViewController = RCTPresentedViewController();
return rootViewController; return rootViewController;
} }
- (dispatch_queue_t)methodQueue - (dispatch_queue_t)methodQueue {
{
return dispatch_get_main_queue(); return dispatch_get_main_queue();
} }
......
...@@ -23,19 +23,9 @@ ...@@ -23,19 +23,9 @@
} }
+ (NSString *)tz_localizedStringForKey:(NSString *)key value:(NSString *)value { + (NSString *)tz_localizedStringForKey:(NSString *)key value:(NSString *)value {
static NSBundle *bundle = nil; NSBundle *bundle = [TZImagePickerConfig sharedInstance].languageBundle;
if (bundle == nil) {
NSString *language = [NSLocale preferredLanguages].firstObject;
if ([language rangeOfString:@"zh-Hans"].location != NSNotFound) {
language = @"zh-Hans";
} else if ([language rangeOfString:@"zh-Hant"].location != NSNotFound) {
language = @"zh-Hant";
} else {
language = @"en";
}
bundle = [NSBundle bundleWithPath:[[NSBundle tz_imagePickerBundle] pathForResource:language ofType:@"lproj"]];
}
NSString *value1 = [bundle localizedStringForKey:key value:value table:nil]; NSString *value1 = [bundle localizedStringForKey:key value:value table:nil];
return value1; return value1;
} }
@end @end
...@@ -46,4 +46,6 @@ typedef enum : NSUInteger { ...@@ -46,4 +46,6 @@ typedef enum : NSUInteger {
@property (nonatomic, assign) BOOL isCameraRoll; @property (nonatomic, assign) BOOL isCameraRoll;
- (void)setResult:(id)result needFetchAssets:(BOOL)needFetchAssets;
@end @end
...@@ -31,16 +31,16 @@ ...@@ -31,16 +31,16 @@
@implementation TZAlbumModel @implementation TZAlbumModel
- (void)setResult:(id)result { - (void)setResult:(id)result needFetchAssets:(BOOL)needFetchAssets {
_result = result; _result = result;
BOOL allowPickingImage = [[[NSUserDefaults standardUserDefaults] objectForKey:@"tz_allowPickingImage"] isEqualToString:@"1"]; if (needFetchAssets) {
BOOL allowPickingVideo = [[[NSUserDefaults standardUserDefaults] objectForKey:@"tz_allowPickingVideo"] isEqualToString:@"1"]; [[TZImageManager manager] getAssetsFromFetchResult:result completion:^(NSArray<TZAssetModel *> *models) {
[[TZImageManager manager] getAssetsFromFetchResult:result allowPickingVideo:allowPickingVideo allowPickingImage:allowPickingImage completion:^(NSArray<TZAssetModel *> *models) {
_models = models; _models = models;
if (_selectedModels) { if (_selectedModels) {
[self checkSelectedModels]; [self checkSelectedModels];
} }
}]; }];
}
} }
- (void)setSelectedModels:(NSArray *)selectedModels { - (void)setSelectedModels:(NSArray *)selectedModels {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#import "UIView+Layout.h" #import "UIView+Layout.h"
#import <ImageIO/ImageIO.h> #import <ImageIO/ImageIO.h>
#import "TZImageManager.h" #import "TZImageManager.h"
#import "TZImagePickerController.h"
@implementation TZImageCropManager @implementation TZImageCropManager
...@@ -131,17 +132,21 @@ ...@@ -131,17 +132,21 @@
animatedImage = [[UIImage alloc] initWithData:data]; animatedImage = [[UIImage alloc] initWithData:data];
} }
else { else {
// images数组过大时内存会飙升,在这里限制下最大count
NSInteger maxCount = [TZImagePickerConfig sharedInstance].gifPreviewMaxImagesCount ?: 200;
NSInteger interval = MAX((count + maxCount / 2) / maxCount, 1);
NSMutableArray *images = [NSMutableArray array]; NSMutableArray *images = [NSMutableArray array];
NSTimeInterval duration = 0.0f; NSTimeInterval duration = 0.0f;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i+=interval) {
CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
if (!image) { if (!image) {
continue; continue;
} }
duration += [self sd_frameDurationAtIndex:i source:source]; duration += [self sd_frameDurationAtIndex:i source:source] * MIN(interval, 3);
[images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
+ (instancetype)manager NS_SWIFT_NAME(default()); + (instancetype)manager NS_SWIFT_NAME(default());
+ (void)deallocManager; + (void)deallocManager;
@property (assign, nonatomic) id<TZImagePickerControllerDelegate> pickerDelegate; @property (weak, nonatomic) id<TZImagePickerControllerDelegate> pickerDelegate;
@property (nonatomic, assign) BOOL shouldFixOrientation; @property (nonatomic, assign) BOOL shouldFixOrientation;
...@@ -50,10 +50,11 @@ ...@@ -50,10 +50,11 @@
- (void)requestAuthorizationWithCompletion:(void (^)(void))completion; - (void)requestAuthorizationWithCompletion:(void (^)(void))completion;
/// Get Album 获得相册/相册数组 /// Get Album 获得相册/相册数组
- (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAlbumModel *model))completion; - (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(TZAlbumModel *model))completion;
- (void)getAllAlbums:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray<TZAlbumModel *> *models))completion; - (void)getAllAlbums:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(NSArray<TZAlbumModel *> *models))completion;
/// Get Assets 获得Asset数组 /// Get Assets 获得Asset数组
- (void)getAssetsFromFetchResult:(id)result completion:(void (^)(NSArray<TZAssetModel *> *models))completion;
- (void)getAssetsFromFetchResult:(id)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray<TZAssetModel *> *models))completion; - (void)getAssetsFromFetchResult:(id)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray<TZAssetModel *> *models))completion;
- (void)getAssetFromFetchResult:(id)result atIndex:(NSInteger)index allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAssetModel *model))completion; - (void)getAssetFromFetchResult:(id)result atIndex:(NSInteger)index allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAssetModel *model))completion;
...@@ -105,6 +106,9 @@ ...@@ -105,6 +106,9 @@
/// 获取asset的资源类型 /// 获取asset的资源类型
- (TZAssetModelMediaType)getAssetType:(id)asset; - (TZAssetModelMediaType)getAssetType:(id)asset;
/// 缩放图片至新尺寸
- (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size;
@end @end
//@interface TZSortDescriptor : NSSortDescriptor //@interface TZSortDescriptor : NSSortDescriptor
......
...@@ -121,7 +121,7 @@ static dispatch_once_t onceToken; ...@@ -121,7 +121,7 @@ static dispatch_once_t onceToken;
#pragma mark - Get Album #pragma mark - Get Album
/// Get Album 获得相册/相册数组 /// Get Album 获得相册/相册数组
- (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(TZAlbumModel *))completion{ - (void)getCameraRollAlbum:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(TZAlbumModel *model))completion {
__block TZAlbumModel *model; __block TZAlbumModel *model;
if (iOS8Later) { if (iOS8Later) {
PHFetchOptions *option = [[PHFetchOptions alloc] init]; PHFetchOptions *option = [[PHFetchOptions alloc] init];
...@@ -136,9 +136,11 @@ static dispatch_once_t onceToken; ...@@ -136,9 +136,11 @@ static dispatch_once_t onceToken;
for (PHAssetCollection *collection in smartAlbums) { for (PHAssetCollection *collection in smartAlbums) {
// 有可能是PHCollectionList类的的对象,过滤掉 // 有可能是PHCollectionList类的的对象,过滤掉
if (![collection isKindOfClass:[PHAssetCollection class]]) continue; if (![collection isKindOfClass:[PHAssetCollection class]]) continue;
// 过滤空相册
if (collection.estimatedAssetCount <= 0) continue;
if ([self isCameraRollAlbum:collection]) { if ([self isCameraRollAlbum:collection]) {
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option]; PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option];
model = [self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES]; model = [self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES needFetchAssets:needFetchAssets];
if (completion) completion(model); if (completion) completion(model);
break; break;
} }
...@@ -148,7 +150,7 @@ static dispatch_once_t onceToken; ...@@ -148,7 +150,7 @@ static dispatch_once_t onceToken;
if ([group numberOfAssets] < 1) return; if ([group numberOfAssets] < 1) return;
if ([self isCameraRollAlbum:group]) { if ([self isCameraRollAlbum:group]) {
NSString *name = [group valueForProperty:ALAssetsGroupPropertyName]; NSString *name = [group valueForProperty:ALAssetsGroupPropertyName];
model = [self modelWithResult:group name:name isCameraRoll:YES]; model = [self modelWithResult:group name:name isCameraRoll:YES needFetchAssets:needFetchAssets];
if (completion) completion(model); if (completion) completion(model);
*stop = YES; *stop = YES;
} }
...@@ -156,7 +158,7 @@ static dispatch_once_t onceToken; ...@@ -156,7 +158,7 @@ static dispatch_once_t onceToken;
} }
} }
- (void)getAllAlbums:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray<TZAlbumModel *> *))completion{ - (void)getAllAlbums:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage needFetchAssets:(BOOL)needFetchAssets completion:(void (^)(NSArray<TZAlbumModel *> *))completion{
NSMutableArray *albumArr = [NSMutableArray array]; NSMutableArray *albumArr = [NSMutableArray array];
if (iOS8Later) { if (iOS8Later) {
PHFetchOptions *option = [[PHFetchOptions alloc] init]; PHFetchOptions *option = [[PHFetchOptions alloc] init];
...@@ -178,6 +180,8 @@ static dispatch_once_t onceToken; ...@@ -178,6 +180,8 @@ static dispatch_once_t onceToken;
for (PHAssetCollection *collection in fetchResult) { for (PHAssetCollection *collection in fetchResult) {
// 有可能是PHCollectionList类的的对象,过滤掉 // 有可能是PHCollectionList类的的对象,过滤掉
if (![collection isKindOfClass:[PHAssetCollection class]]) continue; if (![collection isKindOfClass:[PHAssetCollection class]]) continue;
// 过滤空相册
if (collection.estimatedAssetCount <= 0) continue;
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option]; PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:option];
if (fetchResult.count < 1) continue; if (fetchResult.count < 1) continue;
...@@ -190,9 +194,9 @@ static dispatch_once_t onceToken; ...@@ -190,9 +194,9 @@ static dispatch_once_t onceToken;
if ([collection.localizedTitle tz_containsString:@"Hidden"] || [collection.localizedTitle isEqualToString:@"已隐藏"]) continue; if ([collection.localizedTitle tz_containsString:@"Hidden"] || [collection.localizedTitle isEqualToString:@"已隐藏"]) continue;
if ([collection.localizedTitle tz_containsString:@"Deleted"] || [collection.localizedTitle isEqualToString:@"最近删除"]) continue; if ([collection.localizedTitle tz_containsString:@"Deleted"] || [collection.localizedTitle isEqualToString:@"最近删除"]) continue;
if ([self isCameraRollAlbum:collection]) { if ([self isCameraRollAlbum:collection]) {
[albumArr insertObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES] atIndex:0]; [albumArr insertObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:YES needFetchAssets:needFetchAssets] atIndex:0];
} else { } else {
[albumArr addObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:NO]]; [albumArr addObject:[self modelWithResult:fetchResult name:collection.localizedTitle isCameraRoll:NO needFetchAssets:needFetchAssets]];
} }
} }
} }
...@@ -212,15 +216,15 @@ static dispatch_once_t onceToken; ...@@ -212,15 +216,15 @@ static dispatch_once_t onceToken;
} }
if ([self isCameraRollAlbum:group]) { if ([self isCameraRollAlbum:group]) {
[albumArr insertObject:[self modelWithResult:group name:name isCameraRoll:YES] atIndex:0]; [albumArr insertObject:[self modelWithResult:group name:name isCameraRoll:YES needFetchAssets:needFetchAssets] atIndex:0];
} else if ([name isEqualToString:@"My Photo Stream"] || [name isEqualToString:@"我的照片流"]) { } else if ([name isEqualToString:@"My Photo Stream"] || [name isEqualToString:@"我的照片流"]) {
if (albumArr.count) { if (albumArr.count) {
[albumArr insertObject:[self modelWithResult:group name:name isCameraRoll:NO] atIndex:1]; [albumArr insertObject:[self modelWithResult:group name:name isCameraRoll:NO needFetchAssets:needFetchAssets] atIndex:1];
} else { } else {
[albumArr addObject:[self modelWithResult:group name:name isCameraRoll:NO]]; [albumArr addObject:[self modelWithResult:group name:name isCameraRoll:NO needFetchAssets:needFetchAssets]];
} }
} else { } else {
[albumArr addObject:[self modelWithResult:group name:name isCameraRoll:NO]]; [albumArr addObject:[self modelWithResult:group name:name isCameraRoll:NO needFetchAssets:needFetchAssets]];
} }
} failureBlock:nil]; } failureBlock:nil];
} }
...@@ -229,6 +233,11 @@ static dispatch_once_t onceToken; ...@@ -229,6 +233,11 @@ static dispatch_once_t onceToken;
#pragma mark - Get Assets #pragma mark - Get Assets
/// Get Assets 获得照片数组 /// Get Assets 获得照片数组
- (void)getAssetsFromFetchResult:(id)result completion:(void (^)(NSArray<TZAssetModel *> *))completion {
TZImagePickerConfig *config = [TZImagePickerConfig sharedInstance];
return [self getAssetsFromFetchResult:result allowPickingVideo:config.allowPickingVideo allowPickingImage:config.allowPickingImage completion:completion];
}
- (void)getAssetsFromFetchResult:(id)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray<TZAssetModel *> *))completion { - (void)getAssetsFromFetchResult:(id)result allowPickingVideo:(BOOL)allowPickingVideo allowPickingImage:(BOOL)allowPickingImage completion:(void (^)(NSArray<TZAssetModel *> *))completion {
NSMutableArray *photoArr = [NSMutableArray array]; NSMutableArray *photoArr = [NSMutableArray array];
if ([result isKindOfClass:[PHFetchResult class]]) { if ([result isKindOfClass:[PHFetchResult class]]) {
...@@ -606,7 +615,8 @@ static dispatch_once_t onceToken; ...@@ -606,7 +615,8 @@ static dispatch_once_t onceToken;
if ([asset isKindOfClass:[PHAsset class]]) { if ([asset isKindOfClass:[PHAsset class]]) {
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init]; PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.networkAccessAllowed = YES; option.networkAccessAllowed = YES;
option.resizeMode = PHImageRequestOptionsResizeModeFast; option.version = PHImageRequestOptionsVersionOriginal;
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { [[PHImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]);
if (downloadFinined && imageData) { if (downloadFinined && imageData) {
...@@ -650,7 +660,7 @@ static dispatch_once_t onceToken; ...@@ -650,7 +660,7 @@ static dispatch_once_t onceToken;
request.creationDate = [NSDate date]; request.creationDate = [NSDate date];
} }
} completionHandler:^(BOOL success, NSError *error) { } completionHandler:^(BOOL success, NSError *error) {
dispatch_sync(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (success && completion) { if (success && completion) {
completion(nil); completion(nil);
} else if (error) { } else if (error) {
...@@ -897,9 +907,9 @@ static dispatch_once_t onceToken; ...@@ -897,9 +907,9 @@ static dispatch_once_t onceToken;
#pragma mark - Private Method #pragma mark - Private Method
- (TZAlbumModel *)modelWithResult:(id)result name:(NSString *)name isCameraRoll:(BOOL)isCameraRoll { - (TZAlbumModel *)modelWithResult:(id)result name:(NSString *)name isCameraRoll:(BOOL)isCameraRoll needFetchAssets:(BOOL)needFetchAssets {
TZAlbumModel *model = [[TZAlbumModel alloc] init]; TZAlbumModel *model = [[TZAlbumModel alloc] init];
model.result = result; [model setResult:result needFetchAssets:needFetchAssets];
model.name = name; model.name = name;
model.isCameraRoll = isCameraRoll; model.isCameraRoll = isCameraRoll;
if ([result isKindOfClass:[PHFetchResult class]]) { if ([result isKindOfClass:[PHFetchResult class]]) {
...@@ -912,6 +922,7 @@ static dispatch_once_t onceToken; ...@@ -912,6 +922,7 @@ static dispatch_once_t onceToken;
return model; return model;
} }
/// 缩放图片至新尺寸
- (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size { - (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size {
if (image.size.width > size.width) { if (image.size.width > size.width) {
UIGraphicsBeginImageContext(size); UIGraphicsBeginImageContext(size);
...@@ -919,6 +930,19 @@ static dispatch_once_t onceToken; ...@@ -919,6 +930,19 @@ static dispatch_once_t onceToken;
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); UIGraphicsEndImageContext();
return newImage; return newImage;
/* 好像不怎么管用:https://mp.weixin.qq.com/s/CiqMlEIp1Ir2EJSDGgMooQ
CGFloat maxPixelSize = MAX(size.width, size.height);
CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)UIImageJPEGRepresentation(image, 0.9), nil);
NSDictionary *options = @{(__bridge id)kCGImageSourceCreateThumbnailFromImageAlways:(__bridge id)kCFBooleanTrue,
(__bridge id)kCGImageSourceThumbnailMaxPixelSize:[NSNumber numberWithFloat:maxPixelSize]
};
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, (__bridge CFDictionaryRef)options);
UIImage *newImage = [UIImage imageWithCGImage:imageRef scale:2 orientation:image.imageOrientation];
CGImageRelease(imageRef);
CFRelease(sourceRef);
return newImage;
*/
} else { } else {
return image; return image;
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// //
// Created by 谭真 on 15/12/24. // Created by 谭真 on 15/12/24.
// Copyright © 2015年 谭真. All rights reserved. // Copyright © 2015年 谭真. All rights reserved.
// version 1.9.8 - 2017.12.19 // version 2.0.0.9 - 2018.03.12
// 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController // 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController
/* /*
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
@protocol TZImagePickerControllerDelegate; @protocol TZImagePickerControllerDelegate;
@interface TZImagePickerController : UINavigationController @interface TZImagePickerController : UINavigationController
#pragma mark -
/// Use this init method / 用这个初始化方法 /// Use this init method / 用这个初始化方法
- (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount delegate:(id<TZImagePickerControllerDelegate>)delegate; - (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount delegate:(id<TZImagePickerControllerDelegate>)delegate;
- (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount columnNumber:(NSInteger)columnNumber delegate:(id<TZImagePickerControllerDelegate>)delegate; - (instancetype)initWithMaxImagesCount:(NSInteger)maxImagesCount columnNumber:(NSInteger)columnNumber delegate:(id<TZImagePickerControllerDelegate>)delegate;
...@@ -37,6 +38,7 @@ ...@@ -37,6 +38,7 @@
/// This init method for crop photo / 用这个初始化方法以裁剪图片 /// This init method for crop photo / 用这个初始化方法以裁剪图片
- (instancetype)initCropTypeWithAsset:(id)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,id asset))completion; - (instancetype)initCropTypeWithAsset:(id)asset photo:(UIImage *)photo completion:(void (^)(UIImage *cropImage,id asset))completion;
#pragma mark -
/// Default is 9 / 默认最大可选9张图片 /// Default is 9 / 默认最大可选9张图片
@property (nonatomic, assign) NSInteger maxImagesCount; @property (nonatomic, assign) NSInteger maxImagesCount;
...@@ -84,6 +86,14 @@ ...@@ -84,6 +86,14 @@
/// 默认为YES,如果设置为NO,拍照按钮将隐藏,用户将不能选择照片 /// 默认为YES,如果设置为NO,拍照按钮将隐藏,用户将不能选择照片
@property(nonatomic, assign) BOOL allowTakePicture; @property(nonatomic, assign) BOOL allowTakePicture;
/// 首选语言,如果设置了就用该语言,不设则取当前系统语言。
/// 由于目前只支持中文、繁体中文、英文、越南语。故该属性只支持zh-Hans、zh-Hant、en、vi四种值,其余值无效。
@property (copy, nonatomic) NSString *preferredLanguage;
/// 语言bundle,preferredLanguage变化时languageBundle会变化
/// 可通过手动设置bundle,让选择器支持新的的语言(需要在设置preferredLanguage后设置languageBundle)。欢迎提交PR把语言文件提交上来~
@property (strong, nonatomic) NSBundle *languageBundle;
/// Default is YES, if set NO, user can't preview photo. /// Default is YES, if set NO, user can't preview photo.
/// 默认为YES,如果设置为NO,预览按钮将隐藏,用户将不能去预览照片 /// 默认为YES,如果设置为NO,预览按钮将隐藏,用户将不能去预览照片
@property (nonatomic, assign) BOOL allowPreview; @property (nonatomic, assign) BOOL allowPreview;
...@@ -92,6 +102,10 @@ ...@@ -92,6 +102,10 @@
/// 默认为YES,如果设置为NO, 选择器将不会自己dismiss /// 默认为YES,如果设置为NO, 选择器将不会自己dismiss
@property(nonatomic, assign) BOOL autoDismiss; @property(nonatomic, assign) BOOL autoDismiss;
/// Default is YES, if set NO, in the delegate method the photos and infos will be nil, only assets hava value.
/// 默认为NO,如果设置为YES,代理方法里photos和infos会是nil,只返回assets
@property (assign, nonatomic) BOOL onlyReturnAsset;
/// The photos user have selected /// The photos user have selected
/// 用户选中过的图片数组 /// 用户选中过的图片数组
@property (nonatomic, strong) NSMutableArray *selectedAssets; @property (nonatomic, strong) NSMutableArray *selectedAssets;
...@@ -104,8 +118,12 @@ ...@@ -104,8 +118,12 @@
/// Hide the photo what can not be selected, Default is NO /// Hide the photo what can not be selected, Default is NO
/// 隐藏不可以选中的图片,默认是NO,不推荐将其设置为YES /// 隐藏不可以选中的图片,默认是NO,不推荐将其设置为YES
@property (nonatomic, assign) BOOL hideWhenCanNotSelect; @property (nonatomic, assign) BOOL hideWhenCanNotSelect;
/// 顶部statusBar 是否为系统默认的黑色,默认为NO /// Deprecated, Use statusBarStyle (顶部statusBar 是否为系统默认的黑色,默认为NO)
@property (nonatomic, assign) BOOL isStatusBarDefault; @property (nonatomic, assign) BOOL isStatusBarDefault __attribute__((deprecated("Use -statusBarStyle.")));
/// statusBar的样式,默认为UIStatusBarStyleLightContent
@property (assign, nonatomic) UIStatusBarStyle statusBarStyle;
#pragma mark -
/// Single selection mode, valid when maxImagesCount = 1 /// Single selection mode, valid when maxImagesCount = 1
/// 单选模式,maxImagesCount为1时才生效 /// 单选模式,maxImagesCount为1时才生效
@property (nonatomic, assign) BOOL showSelectBtn; ///< 在单选模式下,照片列表页中,显示选择按钮,默认为NO @property (nonatomic, assign) BOOL showSelectBtn; ///< 在单选模式下,照片列表页中,显示选择按钮,默认为NO
...@@ -119,6 +137,7 @@ ...@@ -119,6 +137,7 @@
@property (nonatomic, copy) void (^navLeftBarButtonSettingBlock)(UIButton *leftButton); ///< 自定义返回按钮样式及其属性 @property (nonatomic, copy) void (^navLeftBarButtonSettingBlock)(UIButton *leftButton); ///< 自定义返回按钮样式及其属性
#pragma mark -
- (id)showAlertWithTitle:(NSString *)title; - (id)showAlertWithTitle:(NSString *)title;
- (void)hideAlertView:(id)alertView; - (void)hideAlertView:(id)alertView;
- (void)showProgressHUD; - (void)showProgressHUD;
...@@ -126,6 +145,7 @@ ...@@ -126,6 +145,7 @@
@property (nonatomic, assign) BOOL isSelectOriginalPhoto; @property (nonatomic, assign) BOOL isSelectOriginalPhoto;
@property (assign, nonatomic) BOOL needShowStatusBar; @property (assign, nonatomic) BOOL needShowStatusBar;
#pragma mark -
@property (nonatomic, copy) NSString *takePictureImageName; @property (nonatomic, copy) NSString *takePictureImageName;
@property (nonatomic, copy) NSString *photoSelImageName; @property (nonatomic, copy) NSString *photoSelImageName;
@property (nonatomic, copy) NSString *photoDefImageName; @property (nonatomic, copy) NSString *photoDefImageName;
...@@ -134,6 +154,7 @@ ...@@ -134,6 +154,7 @@
@property (nonatomic, copy) NSString *photoPreviewOriginDefImageName; @property (nonatomic, copy) NSString *photoPreviewOriginDefImageName;
@property (nonatomic, copy) NSString *photoNumberIconImageName; @property (nonatomic, copy) NSString *photoNumberIconImageName;
#pragma mark -
/// Appearance / 外观颜色 + 按钮文字 /// Appearance / 外观颜色 + 按钮文字
@property (nonatomic, strong) UIColor *oKButtonTitleColorNormal; @property (nonatomic, strong) UIColor *oKButtonTitleColorNormal;
@property (nonatomic, strong) UIColor *oKButtonTitleColorDisabled; @property (nonatomic, strong) UIColor *oKButtonTitleColorDisabled;
...@@ -150,7 +171,7 @@ ...@@ -150,7 +171,7 @@
@property (nonatomic, copy) NSString *settingBtnTitleStr; @property (nonatomic, copy) NSString *settingBtnTitleStr;
@property (nonatomic, copy) NSString *processHintStr; @property (nonatomic, copy) NSString *processHintStr;
/// Public Method #pragma mark -
- (void)cancelButtonClick; - (void)cancelButtonClick;
// The picker should dismiss itself; when it dismissed these handle will be called. // The picker should dismiss itself; when it dismissed these handle will be called.
...@@ -221,6 +242,7 @@ ...@@ -221,6 +242,7 @@
@interface TZAlbumPickerController : UIViewController @interface TZAlbumPickerController : UIViewController
@property (nonatomic, assign) NSInteger columnNumber; @property (nonatomic, assign) NSInteger columnNumber;
@property (assign, nonatomic) BOOL isFirstAppear;
- (void)configTableView; - (void)configTableView;
@end @end
...@@ -239,5 +261,17 @@ ...@@ -239,5 +261,17 @@
@interface TZCommonTools : NSObject @interface TZCommonTools : NSObject
+ (BOOL)tz_isIPhoneX; + (BOOL)tz_isIPhoneX;
+ (CGFloat)tz_statusBarHeight; + (CGFloat)tz_statusBarHeight;
// 获得Info.plist数据字典
+ (NSDictionary *)tz_getInfoDictionary;
@end @end
@interface TZImagePickerConfig : NSObject
+ (instancetype)sharedInstance;
@property (copy, nonatomic) NSString *preferredLanguage;
@property(nonatomic, assign) BOOL allowPickingImage;
@property (nonatomic, assign) BOOL allowPickingVideo;
@property (strong, nonatomic) NSBundle *languageBundle;
/// 默认是200,如果一个GIF过大,里面图片个数可能超过1000,会导致内存飙升而崩溃
@property (assign, nonatomic) NSInteger gifPreviewMaxImagesCount;
@end
...@@ -16,9 +16,9 @@ ...@@ -16,9 +16,9 @@
/// 开始定位 /// 开始定位
- (void)startLocation; - (void)startLocation;
- (void)startLocationWithSuccessBlock:(void (^)(CLLocation *location,CLLocation *oldLocation))successBlock failureBlock:(void (^)(NSError *error))failureBlock; - (void)startLocationWithSuccessBlock:(void (^)(NSArray<CLLocation *> *))successBlock failureBlock:(void (^)(NSError *error))failureBlock;
- (void)startLocationWithGeocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock; - (void)startLocationWithGeocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock;
- (void)startLocationWithSuccessBlock:(void (^)(CLLocation *location,CLLocation *oldLocation))successBlock failureBlock:(void (^)(NSError *error))failureBlock geocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock; - (void)startLocationWithSuccessBlock:(void (^)(NSArray<CLLocation *> *))successBlock failureBlock:(void (^)(NSError *error))failureBlock geocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock;
@end @end
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
@interface TZLocationManager ()<CLLocationManagerDelegate> @interface TZLocationManager ()<CLLocationManagerDelegate>
@property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, strong) CLLocationManager *locationManager;
/// 定位成功的回调block /// 定位成功的回调block
@property (nonatomic, copy) void (^successBlock)(CLLocation *location,CLLocation *oldLocation); @property (nonatomic, copy) void (^successBlock)(NSArray<CLLocation *> *);
/// 编码成功的回调block /// 编码成功的回调block
@property (nonatomic, copy) void (^geocodeBlock)(NSArray *geocodeArray); @property (nonatomic, copy) void (^geocodeBlock)(NSArray *geocodeArray);
/// 定位失败的回调block /// 定位失败的回调block
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
[self startLocationWithSuccessBlock:nil failureBlock:nil geocoderBlock:nil]; [self startLocationWithSuccessBlock:nil failureBlock:nil geocoderBlock:nil];
} }
- (void)startLocationWithSuccessBlock:(void (^)(CLLocation *location,CLLocation *oldLocation))successBlock failureBlock:(void (^)(NSError *error))failureBlock { - (void)startLocationWithSuccessBlock:(void (^)(NSArray<CLLocation *> *))successBlock failureBlock:(void (^)(NSError *error))failureBlock {
[self startLocationWithSuccessBlock:successBlock failureBlock:failureBlock geocoderBlock:nil]; [self startLocationWithSuccessBlock:successBlock failureBlock:failureBlock geocoderBlock:nil];
} }
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
[self startLocationWithSuccessBlock:nil failureBlock:nil geocoderBlock:geocoderBlock]; [self startLocationWithSuccessBlock:nil failureBlock:nil geocoderBlock:geocoderBlock];
} }
- (void)startLocationWithSuccessBlock:(void (^)(CLLocation *location,CLLocation *oldLocation))successBlock failureBlock:(void (^)(NSError *error))failureBlock geocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock { - (void)startLocationWithSuccessBlock:(void (^)(NSArray<CLLocation *> *))successBlock failureBlock:(void (^)(NSError *error))failureBlock geocoderBlock:(void (^)(NSArray *geocoderArray))geocoderBlock {
[self.locationManager startUpdatingLocation]; [self.locationManager startUpdatingLocation];
_successBlock = successBlock; _successBlock = successBlock;
_geocodeBlock = geocoderBlock; _geocodeBlock = geocoderBlock;
...@@ -57,16 +57,16 @@ ...@@ -57,16 +57,16 @@
#pragma mark - CLLocationManagerDelegate #pragma mark - CLLocationManagerDelegate
/// 地理位置发生改变时触发 /// 地理位置发生改变时触发
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
[manager stopUpdatingLocation]; [manager stopUpdatingLocation];
if (_successBlock) { if (_successBlock) {
_successBlock(newLocation,oldLocation); _successBlock(locations);
} }
if (_geocodeBlock) { if (_geocodeBlock && locations.count) {
CLGeocoder *geocoder = [[CLGeocoder alloc] init]; CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error) { [geocoder reverseGeocodeLocation:[locations firstObject] completionHandler:^(NSArray *array, NSError *error) {
_geocodeBlock(array); _geocodeBlock(array);
}]; }];
} }
......
...@@ -246,8 +246,9 @@ ...@@ -246,8 +246,9 @@
_originalPhotoButton.frame = CGRectMake(0, 0, fullImageWidth + 56, 44); _originalPhotoButton.frame = CGRectMake(0, 0, fullImageWidth + 56, 44);
_originalPhotoLabel.frame = CGRectMake(fullImageWidth + 42, 0, 80, 44); _originalPhotoLabel.frame = CGRectMake(fullImageWidth + 42, 0, 80, 44);
} }
_doneButton.frame = CGRectMake(self.view.tz_width - 44 - 12, 0, 44, 44); [_doneButton sizeToFit];
_numberImageView.frame = CGRectMake(self.view.tz_width - 56 - 28, 7, 30, 30); _doneButton.frame = CGRectMake(self.view.tz_width - _doneButton.tz_width - 12, 0, _doneButton.tz_width, toolBarHeight);
_numberImageView.frame = CGRectMake(_doneButton.tz_left - 30 - 2, (toolBarHeight - 30) / 2, 30, 30);
_numberLabel.frame = _numberImageView.frame; _numberLabel.frame = _numberImageView.frame;
[self configCropView]; [self configCropView];
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
UIStatusBarStyle _originStatusBarStyle; UIStatusBarStyle _originStatusBarStyle;
} }
@property (assign, nonatomic) BOOL needShowStatusBar;
@end @end
#pragma clang diagnostic push #pragma clang diagnostic push
...@@ -35,6 +36,7 @@ ...@@ -35,6 +36,7 @@
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
self.needShowStatusBar = ![UIApplication sharedApplication].statusBarHidden;
self.view.backgroundColor = [UIColor blackColor]; self.view.backgroundColor = [UIColor blackColor];
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
if (tzImagePickerVc) { if (tzImagePickerVc) {
...@@ -57,8 +59,8 @@ ...@@ -57,8 +59,8 @@
- (void)configMoviePlayer { - (void)configMoviePlayer {
[[TZImageManager manager] getPhotoWithAsset:_model.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { [[TZImageManager manager] getPhotoWithAsset:_model.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) {
_cover = photo;
if (!isDegraded && photo) { if (!isDegraded && photo) {
_cover = photo;
_doneButton.enabled = YES; _doneButton.enabled = YES;
} }
}]; }];
...@@ -104,7 +106,9 @@ ...@@ -104,7 +106,9 @@
_doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; _doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
_doneButton.titleLabel.font = [UIFont systemFontOfSize:16]; _doneButton.titleLabel.font = [UIFont systemFontOfSize:16];
if (!_cover) {
_doneButton.enabled = NO; _doneButton.enabled = NO;
}
[_doneButton addTarget:self action:@selector(doneButtonClick) forControlEvents:UIControlEventTouchUpInside]; [_doneButton addTarget:self action:@selector(doneButtonClick) forControlEvents:UIControlEventTouchUpInside];
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController;
if (tzImagePickerVc) { if (tzImagePickerVc) {
...@@ -185,8 +189,7 @@ ...@@ -185,8 +189,7 @@
[self.navigationController setNavigationBarHidden:NO]; [self.navigationController setNavigationBarHidden:NO];
[_playButton setImage:[UIImage imageNamedFromMyBundle:@"MMVideoPreviewPlay"] forState:UIControlStateNormal]; [_playButton setImage:[UIImage imageNamedFromMyBundle:@"MMVideoPreviewPlay"] forState:UIControlStateNormal];
TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; if (self.needShowStatusBar && iOS7Later) {
if (tzImagePickerVc.needShowStatusBar && iOS7Later) {
[UIApplication sharedApplication].statusBarHidden = NO; [UIApplication sharedApplication].statusBarHidden = NO;
} }
} }
......
{ {
"name": "react-native-syan-image-picker", "name": "react-native-syan-image-picker",
"version": "0.1.0", "version": "0.1.1",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
...@@ -18,5 +18,5 @@ ...@@ -18,5 +18,5 @@
"Photo" "Photo"
], ],
"author": "", "author": "",
"license": "" "license": "MIT"
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment