iOS-自定義照片選擇器+裁剪圖片

這兩天產(chǎn)品說(shuō)我用系統(tǒng)的UIImagePickerController界面UI很丑寥假,迫不得已下就選擇了自定義一個(gè)照片選擇器笋除。實(shí)現(xiàn)效果如下圖:

demo中3張效果圖.png
實(shí)現(xiàn)步驟

具體實(shí)現(xiàn)就兩個(gè)步驟:
1.用系統(tǒng)的<Photos/Photos.h>框架異步獲取到相冊(cè)中的所有圖片(包括原圖和縮略圖)届腐,然后用collectionview進(jìn)行展示縮略圖苛茂。
2.再對(duì)獲取到相冊(cè)圖片的原圖進(jìn)行裁剪,分圓形裁剪和方形裁剪胧后。裁剪框路徑使用貝塞爾曲線分別設(shè)置的路徑

//設(shè)置圓形路徑舍败。
 + (instancetype)bezierPathWithOvalInRect:(CGRect)rect; 
//設(shè)置帶有圓角的矩形路徑
 + (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius ```

######具體代碼
寫(xiě)了個(gè)```UIImage+Extension.h```的分類谤祖,異步并發(fā)獲取到所有圖片

/**
獲取系統(tǒng)相冊(cè)中所有的縮略圖 和原圖
縮略圖 尺寸 大約 {32.5闪彼,60} (allSmallImageArray 回調(diào)獲取到的縮略圖 圖片數(shù)組)
原圖 尺寸 大約 屏幕等大 (allOriginalImageArray 回調(diào)獲取到的大圖 圖片數(shù)組)

*/

  • (void)async_getLibraryPhoto:(void(^)(NSArray <UIImage *> *allSmallImageArray))smallImageCallBack
    allOriginalImageCallBack:(void(^)(NSArray <UIImage *> *allOriginalImageArray))allOriginalImageCallBack
    {
    static UIImage *image;image = [UIImage new];
    dispatch_queue_t concurrencyQueue = dispatch_queue_create("getLibiaryAllImage-queue",
    DISPATCH_QUEUE_CONCURRENT);
    // task 1 : 獲得相冊(cè)中所有 縮略圖
    dispatch_async(concurrencyQueue, ^{
    NSMutableArray *smallPhotoArray = [NSMutableArray array];
    [smallPhotoArray addObjectsFromArray:[UIImage getImageWithScaleImage:image isOriginalPhoto:NO]];
    dispatch_async(dispatch_get_main_queue(), ^{
    if (smallImageCallBack) {
    smallImageCallBack([smallPhotoArray copy]);
    }
    });
    });
    // task 2 : 獲得相冊(cè)中所有 原圖
    dispatch_async(concurrencyQueue, ^{
    NSMutableArray *allOriginalPhotoArray = [NSMutableArray array];
    [allOriginalPhotoArray addObjectsFromArray:[UIImage getImageWithScaleImage:image isOriginalPhoto:YES]];
    dispatch_async(dispatch_get_main_queue(), ^{
    if (allOriginalImageCallBack) {
    allOriginalImageCallBack([allOriginalPhotoArray copy]);
    }
    });
    });
    }
  • (NSArray <UIImage *> *)getImageWithScaleImage:(UIImage *)image isOriginalPhoto:(BOOL)isOriginalPhoto
    {
    NSMutableArray *photoArray = [NSMutableArray array];
    // 獲得所有的自定義相冊(cè)
    PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    // 遍歷所有的自定義相冊(cè)
    for (PHAssetCollection *assetCollection in assetCollections) {
    [photoArray addObjectsFromArray:[image enumerateAssetsInAssetCollection:assetCollection original:isOriginalPhoto]];
    }
    // 獲得相機(jī)膠卷相冊(cè)
    PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
    [photoArray addObjectsFromArray:[image enumerateAssetsInAssetCollection:cameraRoll original:isOriginalPhoto]];
    return photoArray;
    }

/**

  • 遍歷相簿中的所有圖片
  • @param assetCollection 相冊(cè)
  • @param original 是否需要原圖
    */
  • (NSArray <UIImage *> *)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original
    {
    NSMutableArray *array = [NSMutableArray array];
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    // 同步獲得圖片
    options.synchronous = YES;
    // 獲得某個(gè)相簿中的所有PHAsset對(duì)象
    PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
    for (PHAsset *asset in assets) {
    CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero;
    // 從asset中獲得圖片
    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
    [array addObject:result];
    }];
    }
    return array;
    } ```

然后自定義一個(gè)照片控制器繼承于UICollectionViewController 甜孤,設(shè)置代理回調(diào)方法和初始化方法
HPPhotoPickerController.h

#import <UIKit/UIKit.h>

@class HPPhotoPickerController;

@protocol HPPhotoPickerControllerDelegate <NSObject>

- (void)imagePickerController:(HPPhotoPickerController *)picker didFinishPickingWithImage:(UIImage *)image;

@end

@interface HPPhotoPickerController : UICollectionViewController

@property (nonatomic ,weak) id <HPPhotoPickerControllerDelegate> delegate;

/**
 照片 選擇控制器 初始化 方法

 @param delegate  控制器代理
 @param isOvalClip 裁剪方式  YES : 正方形裁剪  NO :圓形裁剪
 @param layout 控制器 layout
 @return self
 */
- (instancetype)initWithDelegate:(id)delegate
              isOvalClip:(BOOL)isOvalClip
              flowLayout:(UICollectionViewFlowLayout *)layout;

@end ```

```HPPhotoPickerController.m```獲取圖片然后去下個(gè)界面進(jìn)行裁剪

#import "HPPhotoPickerController.h"
#import "UIImage+Extension.h"
#import "HPPhotoPickerDetailController.h"

@class HPPickerImageViewCell;

@interface HPPhotoPickerController ()<UICollectionViewDelegateFlowLayout>
{
    BOOL  _isOvalClip;
}
@property (nonatomic ,strong) NSMutableArray *smallphotoArray;
@property (nonatomic ,strong) NSMutableArray *bigPhotoArray;

@end

@implementation HPPhotoPickerController

static NSString * const reuseIdentifier = @"Cell";

- (void)getData
{
    [UIImage async_getLibraryPhoto:^(NSArray<UIImage *> *allSmallImageArray) {
        NSLog(@"***小**%ld",allSmallImageArray.count);
        [self.smallphotoArray addObjectsFromArray:allSmallImageArray];
        [self.collectionView reloadData];
    } allOriginalImageCallBack:^(NSArray<UIImage *> *allOriginalImageArray) {
        NSLog(@"***大**%ld",allOriginalImageArray.count);
        [self.bigPhotoArray addObjectsFromArray:allOriginalImageArray];
    }];
}

#pragma mark <UICollectionViewDataSource>

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
  
    if (self.smallphotoArray.count > 0) {
        return self.smallphotoArray.count;
    }
    return 0;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    HPPickerImageViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
    cell.photo.image = self.smallphotoArray[indexPath.row];
    return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
     //判斷大于0,是做安全處理,大圖加載慢缴川,防止還沒(méi)加載完畢就push囱稽,造成數(shù)據(jù)傳空
    if (self.bigPhotoArray.count > 0) {
        HPPhotoPickerDetailController *detailVC = [[HPPhotoPickerDetailController alloc]initWithImage:self.bigPhotoArray[indexPath.row] delegate:self];
        detailVC.ovalClip = _isOvalClip;
         [self.navigationController pushViewController:detailVC animated:YES];
    }
} ```

裁剪圖片的控制器是參照這位同學(xué)寫(xiě)的[iOS實(shí)現(xiàn)頭像裁剪(方或圓)功能二跋,支持縮放拖曳](http://www.reibang.com/p/d9ca82c1834c)

[這是demo地址,大家加油流昏,開(kāi)源使人進(jìn)步扎即。。况凉。](https://github.com/leijianmin/PhotoPickerController)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谚鄙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刁绒,更是在濱河造成了極大的恐慌闷营,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件知市,死亡現(xiàn)場(chǎng)離奇詭異傻盟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嫂丙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)娘赴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人跟啤,你說(shuō)我怎么就攤上這事诽表。” “怎么了隅肥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵竿奏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我腥放,道長(zhǎng)泛啸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任捉片,我火速辦了婚禮平痰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伍纫。我一直安慰自己宗雇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布莹规。 她就那樣靜靜地躺著赔蒲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舞虱,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天欢际,我揣著相機(jī)與錄音,去河邊找鬼矾兜。 笑死损趋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椅寺。 我是一名探鬼主播浑槽,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼返帕!你這毒婦竟也來(lái)了桐玻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荆萤,失蹤者是張志新(化名)和其女友劉穎镊靴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體链韭,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偏竟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梧油。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苫耸。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖儡陨,靈堂內(nèi)的尸體忽然破棺而出褪子,到底是詐尸還是另有隱情,我是刑警寧澤骗村,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布嫌褪,位于F島的核電站,受9級(jí)特大地震影響胚股,放射性物質(zhì)發(fā)生泄漏笼痛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一琅拌、第九天 我趴在偏房一處隱蔽的房頂上張望缨伊。 院中可真熱鬧,春花似錦进宝、人聲如沸刻坊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谭胚。三九已至徐块,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灾而,已是汗流浹背胡控。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旁趟,地道東北人昼激。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锡搜,于是被迫代替她去往敵國(guó)和親癣猾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,284評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)余爆、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,120評(píng)論 4 61
  • 昨天把之前寫(xiě)的文字標(biāo)題全部改為日記夸盟,接下來(lái)的10天我也會(huì)以日記的形式去完成蛾方,或許我能寫(xiě)的也只是日記。 年底了上陕,工作...
    東莞紫依閱讀 186評(píng)論 0 0
  • 已經(jīng)斷更好久了释簿,今天突然再次開(kāi)始寫(xiě)文是源于我最近和死黨W的幾次聊天亚隅。最近W剛剛結(jié)束了上一份工作,來(lái)到廈門(mén)重新開(kāi)始庶溶,...
    游戲荒姐閱讀 403評(píng)論 0 0