iOS选择相册图片并展示
2016-06-20 本文已影响3185人
Nedoloroso
承接上一文,这篇是选择图片的文章,具体代码如下
有必要说一下的是isRemovePic是判断当前是否是删除照片;imageArray是用户选择的相片数组
值得一提的是,我采用了CTAssetsPickerController图片选择器,貌似这个作者现在不再维护这份代码了,而也没能在GitHub上找到更好的图片选择器,所以各位同学如果有更好的图片选择器,请一定要告诉我噢!
/** 加载照片*/
- (void)setImage {
/** 如果是通过删除照片的方法进到加载照片就不添加加号图片进去*/
if (!self.isRemovePic) {
UIImage *addImage = [UIImage imageNamed:@"PicUpload_add"];
[self.imageArray addObject:addImage];
}
self.isRemovePic = NO;
for (NSInteger i = 0; i < [self.imageArray count]; i++) {
CGFloat letterWidth = (SCREEN_WIDTH - 6 * LINKHOME_CUSTOM_DISTANCE_TEN) / 5;
CGFloat imageViewX = i * (letterWidth + LINKHOME_CUSTOM_DISTANCE_TEN) + LINKHOME_CUSTOM_DISTANCE_TEN;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(imageViewX, 0, letterWidth, letterWidth)];
imageView.userInteractionEnabled = YES;
imageView.image = self.imageArray[i];
imageView.tag = kImageTag + i;
/** 因为最后一个一定是添加的图片,所以给最后一个添加一个点击添加手势*/
if (i == [self.imageArray count] - 1) {
UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openPhoto)];
[imageView addGestureRecognizer:tapGes];
} else { /** 为图片添加一个右上角的删除按钮并且添加一个点击显示大图的手势*/
UIButton *removeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
CGFloat removeX = letterWidth * 4 / 5;
CGFloat removeW = letterWidth / 5;
removeBtn.frame = CGRectMake(removeX, 0, removeW, removeW);
[removeBtn setImage:[UIImage imageNamed:@"PicUpload_remove"] forState:UIControlStateNormal];
[removeBtn addTarget:self action:@selector(removeImage:) forControlEvents:UIControlEventTouchUpInside];
removeBtn.tag = i;
[imageView addSubview:removeBtn];
HLFeedBackImageTapGestureRecongnizer *tapGes = [[HLFeedBackImageTapGestureRecongnizer alloc] initWithTarget:self action:@selector(tapImage:)];
tapGes.imageArray = self.imageArray;
[imageView addGestureRecognizer:tapGes];
}
[self addSubview:imageView];
}
}
/** 打开相册*/
- (void)openPhoto {
/** 判断当前授权状态*/
PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus];
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusRestricted: /** 系统级别的控制(如家长控制)*/
break;
case PHAuthorizationStatusDenied: /** 用户选择了取消*/
if (oldStatus != PHAuthorizationStatusNotDetermined) {
break;
}
break;
case PHAuthorizationStatusAuthorized: /** 当前用户允许app访问相册*/
[self choosePhotos];
default:
break;
}
}];
}
/** 选择图片*/
- (void)choosePhotos {
dispatch_async(dispatch_get_main_queue(), ^{
CTAssetsPickerController *picker = [[CTAssetsPickerController alloc] init];
picker.showsSelectionIndex = YES;
picker.delegate = self;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
picker.modalPresentationStyle = UIModalPresentationFormSheet;
}
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
[window.rootViewController presentViewController:picker animated:YES completion:nil];
});
}
/** 重新加载照片*/
- (void)reload {
/** 首先把当前显示的所有控件都移除*/
for (UIView *view in [self subviews]) {
[view removeFromSuperview];
}
/** 再将数组中的图片重新排列出来*/
[self setImage];
}
/** 移除某一张照片*/
- (void)removeImage:(UIButton *)button {
self.isRemovePic = YES;
[self.imageArray removeObjectAtIndex:button.tag];
[self reload];
}
/** 点击图片的手势*/
- (void)tapImage:(HLFeedBackImageTapGestureRecongnizer *)tapGes{
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIView *maskview = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
maskview.backgroundColor = [UIColor blackColor];
[window addSubview:maskview];
HLFeedBackShowImageView *fbImageV = [[HLFeedBackShowImageView alloc] initWithFrame:[UIScreen mainScreen].bounds byClick:tapGes.view.tag appendArray:tapGes.imageArray];
[fbImageV show:maskview didFinish:^(){
[UIView animateWithDuration:0.5f animations:^{
fbImageV.alpha = 0.0f;
maskview.alpha = 0.0f;
} completion:^(BOOL finished) {
[fbImageV removeFromSuperview];
[maskview removeFromSuperview];
}];
}];
}
#pragma mark - CTAssetsPickerControllerDelegate
/** 选择完成时会调用*/
- (void)assetsPickerController:(CTAssetsPickerController *)picker didFinishPickingAssets:(NSArray<PHAsset *> *)assets {
/** 关闭图片选择控制器*/
[picker dismissViewControllerAnimated:YES completion:^{
CGFloat scale = [UIScreen mainScreen].scale;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeExact;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
/** 遍历选择的所有图片*/
for (NSInteger i = 0; i < assets.count; i++) {
PHAsset *asset = assets[i];
CGSize size = CGSizeMake(asset.pixelWidth / scale, asset.pixelHeight / scale);
/** 获取图片*/
[[PHImageManager defaultManager] requestImageForAsset:asset
targetSize:size
contentMode:PHImageContentModeDefault
options:options
resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
[self.imageArray removeLastObject];
[self.imageArray addObject:result];
/** 刷新*/
[self reload];
}];
}
}];
}
/** 相片的最大选择数方法*/
- (BOOL)assetsPickerController:(CTAssetsPickerController *)picker shouldSelectAsset:(PHAsset *)asset {
NSInteger max = 5;
if (picker.selectedAssets.count + self.imageArray.count - 1 >= max) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:LocatizedStirngForkey(@"notice") message:LocatizedStirngForkey(@"feedback_more_photo") preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:LocatizedStirngForkey(@"dialog_OK") style:UIAlertActionStyleDefault handler:nil]];
[picker presentViewController:alert animated:YES completion:nil];
return NO;
}
return YES;
}
下面的是,在页面上展示出选择图片后,点击图片能够显示大图并且能够放大缩小滑动等:
.h:
typedef void(^didRemoveImage)(void);
@interface HLFeedBackShowImageView : UIView<UIScrollViewDelegate>
{
UIImageView *showImage;
}
@property (nonatomic,copy) didRemoveImage removeImg;
- (void)show:(UIView *)bgView didFinish:(didRemoveImage)tempBlock;
- (id)initWithFrame:(CGRect)frame byClick:(NSInteger)clickTag appendArray:(NSArray *)appendArray;
.m:
#define kImageTag 9999
@implementation HLFeedBackShowImageView
{
UIScrollView *_scrollView;
CGRect self_Frame;
NSInteger page;
BOOL doubleClick;
}
- (id)initWithFrame:(CGRect)frame byClick:(NSInteger)clickTag appendArray:(NSArray *)appendArray {
if ([super initWithFrame:frame]) {
self_Frame = frame;
self.alpha = 0.0f;
page = 0;
doubleClick = YES;
NSMutableArray *array = [NSMutableArray arrayWithArray:appendArray];
[array removeLastObject];
[self configScrollViewWith:clickTag andAppendArray:array];
UITapGestureRecognizer *tapGser = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disappear)];
tapGser.numberOfTouchesRequired = 1;
tapGser.numberOfTapsRequired = 1;
[self addGestureRecognizer:tapGser];
UITapGestureRecognizer *doubleTapGser = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeBig:)];
doubleTapGser.numberOfTapsRequired = 2;
[self addGestureRecognizer:doubleTapGser];
[tapGser requireGestureRecognizerToFail:doubleTapGser];
}
return self;
}
- (void)configScrollViewWith:(NSInteger)clickTag andAppendArray:(NSArray *)appendArray {
_scrollView = [[UIScrollView alloc] initWithFrame:self_Frame];
_scrollView.backgroundColor = [UIColor blackColor];
_scrollView.pagingEnabled = true;
_scrollView.delegate = self;
_scrollView.contentSize = CGSizeMake(self.frame.size.width * appendArray.count, 0);
[self addSubview:_scrollView];
float W = self.frame.size.width;
for (int i = 0; i < appendArray.count; i ++) {
UIScrollView *imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(self.frame.size.width * i, 0, self.frame.size.width, self.frame.size.height)];
imageScrollView.backgroundColor = [UIColor blackColor];
imageScrollView.contentSize = CGSizeMake(self.frame.size.width, self.frame.size.height);
imageScrollView.delegate = self;
imageScrollView.maximumZoomScale = 4;
imageScrollView.minimumZoomScale = 1;
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
UIImage *img = [appendArray objectAtIndex:i];
imageView.image = img;
imageView.contentMode = UIViewContentModeScaleAspectFit;
[imageScrollView addSubview:imageView];
[_scrollView addSubview:imageScrollView];
imageScrollView.tag = 100 + i ;
imageView.tag = 1000 + i;
}
[_scrollView setContentOffset:CGPointMake(W * (clickTag - kImageTag), 0) animated:YES];
page = clickTag - kImageTag;
}
- (void)disappear {
_removeImg();
}
- (void)changeBig:(UITapGestureRecognizer *)tapGes {
CGFloat newscale = 1.9;
UIScrollView *currentScrollView = (UIScrollView *)[self viewWithTag:page + 100];
CGRect zoomRect = [self zoomRectForScale:newscale withCenter:[tapGes locationInView:tapGes.view] andScrollView:currentScrollView];
if (doubleClick == YES) {
[currentScrollView zoomToRect:zoomRect animated:YES];
}else {
[currentScrollView zoomToRect:currentScrollView.frame animated:YES];
}
doubleClick = !doubleClick;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
UIImageView *imageView = (UIImageView *)[self viewWithTag:scrollView.tag + 900];
return imageView;
}
- (CGRect)zoomRectForScale:(CGFloat)newscale withCenter:(CGPoint)center andScrollView:(UIScrollView *)scrollV {
CGRect zoomRect = CGRectZero;
zoomRect.size.height = scrollV.frame.size.height / newscale;
zoomRect.size.width = scrollV.frame.size.width / newscale;
zoomRect.origin.x = center.x - (zoomRect.size.width / 2.0);
zoomRect.origin.y = center.y - (zoomRect.size.height / 2.0);
return zoomRect;
}
- (void)show:(UIView *)bgView didFinish:(didRemoveImage)tempBlock {
[bgView addSubview:self];
_removeImg = tempBlock;
[UIView animateWithDuration:.4f animations:^{
self.alpha = 1.0f;
}];
}
#pragma mark - ScorllViewDelegate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGPoint offset = _scrollView.contentOffset;
page = offset.x / self.frame.size.width ;
UIScrollView *scrollV_next = (UIScrollView *)[self viewWithTag:page + 100 + 1]; /** 前一页*/
if (scrollV_next.zoomScale != 1.0){
scrollV_next.zoomScale = 1.0;
}
UIScrollView *scollV_pre = (UIScrollView *)[self viewWithTag:page + 100 - 1]; /** 后一页*/
if (scollV_pre.zoomScale != 1.0){
scollV_pre.zoomScale = 1.0;
}
}