#import"ViewController.h"
@interfaceViewController()
@property(strong,nonatomic)IBOutletUIImageView*myHeadPortrait;
@end
@implementationViewController
- (void)viewDidLoad
{??
[superviewDidLoad];
//? 調(diào)用setHeadPortrait方法
[selfsetHeadPortrait];
}
#pragma mark - 設(shè)置頭像-(void)setHeadPortrait {? ? //? ? //? 把頭像設(shè)置成圓形//? ? self.iconImg.layer.cornerRadius=self.iconImg.frame.size.width/2;//? ? self.iconImg.layer.masksToBounds=YES;? ? //? 給頭像加一個圓形邊框? ? self.iconImg.layer.borderWidth = 1.5f;? ? self.iconImg.layer.borderColor = [UIColor whiteColor].CGColor;? ? /**? ? *? 添加手勢:也就是當(dāng)用戶點擊頭像了之后,對這個操作進(jìn)行反應(yīng)? ? */? ? //允許用戶交互? ? _iconImg.userInteractionEnabled = YES;? ? //初始化一個手勢? ? UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? action:@selector(alterHeadPortrait:)];? ? //給imageView添加手勢? ? [_iconImg addGestureRecognizer:singleTap];? ? }//? 方法:alterHeadPortrait-(void)alterHeadPortrait:(UITapGestureRecognizer *)gesture{? ? /**? ? ? *? 彈出提示框? ? ? */? ? //初始化提示框? ? UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];? ? //按鈕:從相冊選擇,類型:UIAlertActionStyleDefault? ? [alert addAction:[UIAlertAction actionWithTitle:@"從相冊選擇" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {? ? ? ? ? //初始化UIImagePickerController? ? ? ? ? UIImagePickerController *PickerImage = [[UIImagePickerController alloc]init];? ? ? ? ? //獲取方式1:通過相冊(呈現(xiàn)全部相冊),UIImagePickerControllerSourceTypePhotoLibrary? ? ? ? ? //獲取方式2,通過相機(jī),UIImagePickerControllerSourceTypeCamera? ? ? ? ? //獲取方法3,通過相冊(呈現(xiàn)全部圖片),UIImagePickerControllerSourceTypeSavedPhotosAlbum? ? ? ? ? PickerImage.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;? ? ? ? ? //允許編輯,即放大裁剪? ? ? ? ? PickerImage.allowsEditing = YES;? ? ? ? ? //自代理? ? ? ? ? PickerImage.delegate = self;? ? ? ? ? //頁面跳轉(zhuǎn)? ? ? ? ? [self presentViewController:PickerImage animated:YES completion:nil];? ? }]];? ? //按鈕:拍照,類型:UIAlertActionStyleDefault? ? [alert addAction:[UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action){? ? ? ? ? /**? ? ? ? ? 其實和從相冊選擇一樣,只是獲取方式不同,前面是通過相冊,而現(xiàn)在,我們要通過相機(jī)的方式? ? ? ? ? */? ? ? ? ? UIImagePickerController *PickerImage = [[UIImagePickerController alloc]init];? ? ? ? ? //獲取方式:通過相機(jī)? ? ? ? ? PickerImage.sourceType = UIImagePickerControllerSourceTypeCamera;? ? ? ? ? PickerImage.allowsEditing = YES;? ? ? ? ? PickerImage.delegate = self;? ? ? ? ? [self presentViewController:PickerImage animated:YES completion:nil];? ? }]];? ? //按鈕:取消,類型:UIAlertActionStyleCancel? ? [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];? ? [self presentViewController:alert animated:YES completion:nil];}//PickerImage完成后的代理方法- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info{
//定義一個newPhoto,用來存放我們選擇的圖片。
UIImage *newPhoto = [info objectForKey:@"UIImagePickerControllerEditedImage"];
self.iconImg.image = newPhoto;
[self dismissViewControllerAnimated:YES completion:nil];
}
空格自己分開下。。。。xcode復(fù)制過來就這樣了
大致流程
一般在APP中,修改頭像是最基本的功能之一了。一般是兩種方式的修改:從相冊選擇圖片或者拍照。那么這里就來講一下如何具體實現(xiàn)這個功能。
Step1:點擊頭像 ->手勢(UITapGestureRecognizer)

QQ的更換頭像操作
首先,點擊頭像。因為頭像是直接放在ImageView中的,默認(rèn)情況下當(dāng)我們點擊頭像的時候,頭像是不會有任何反應(yīng)的。因此,我們需要給頭像的ImageView添加一個點擊事件,方法如下:
/**
*? 添加手勢:也就是當(dāng)用戶點擊頭像了之后,對這個操作進(jìn)行反應(yīng)
*///允許用戶交互_myHeadPortrait.userInteractionEnabled=YES;//初始化一個手勢UITapGestureRecognizer*singleTap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(alterHeadPortrait:)];//給ImageView添加手勢[_myHeadPortrait addGestureRecognizer:singleTap];? ? }
Step2:彈出選擇提示->提示框(UIAlertController)
通過添加UITapGestureRecognizer(手勢),系統(tǒng)就知道了我點擊了頭像,接著,就可以添加具體的方法來進(jìn)行操作了。在上一步,我為這個手勢的action,selector(選擇)了一個方法來執(zhí)行,即alterHeadPortrait:(注意有冒號的),也就是當(dāng)我們點擊了頭像之后,會執(zhí)行alterHeadPortrait:這個方法:
//? 方法:alterHeadPortrait-(void)alterHeadPortrait:(UITapGestureRecognizer*)gesture{/**
*? 彈出提示框
*///初始化提示框UIAlertController*alert = [UIAlertControlleralertControllerWithTitle:nilmessage:nilpreferredStyle:UIAlertControllerStyleActionSheet];//按鈕:從相冊選擇,類型:UIAlertActionStyleDefault[alert addAction:[UIAlertActionactionWithTitle:@"從相冊選擇"style:UIAlertActionStyleDefaulthandler:nil]];//按鈕:拍照,類型:UIAlertActionStyleDefault[alert addAction:[UIAlertActionactionWithTitle:@"拍照"style:UIAlertActionStyleDefaulthandler:nil]];//按鈕:取消,類型:UIAlertActionStyleCancel[alert addAction:[UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:nil]];? ? [selfpresentViewController:alert animated:YEScompletion:nil];}
通過UIAlertController(提示框)這個類,我們創(chuàng)建好了一個提示框,如下:

點擊頭像,彈出提示框
現(xiàn)在,當(dāng)我們點擊取消(或者點擊按鈕以外的區(qū)域)提示框就會被自動取消掉,并將提示框收起來。
Step3:從相冊選擇或者拍照選擇頭像->UIImagePickerController
好了,繞了這么久,終于開始進(jìn)入主題了,即選擇圖片或者拍照了。那么現(xiàn)在該腫么辦呢?好像毫無頭緒的樣子。。。
這里就需要通過UIImagePickerController,通過它,我們就可以讓我們的APP輕松的實現(xiàn)訪問相冊或者拍照:
操作UIImagePickerController,需要實現(xiàn)兩個協(xié)議:
進(jìn)行相冊圖片選擇或者相機(jī)拍照的實現(xiàn)代碼如下:
//初始化UIImagePickerControllerUIImagePickerController*PickerImage = [[UIImagePickerControlleralloc]init];//獲取方式1:通過相冊(呈現(xiàn)全部相冊),UIImagePickerControllerSourceTypePhotoLibrary//獲取方式2,通過相機(jī),UIImagePickerControllerSourceTypeCamera//獲取方方式3,通過相冊(呈現(xiàn)全部圖片),UIImagePickerControllerSourceTypeSavedPhotosAlbumPickerImage.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;//方式1//允許編輯,即放大裁剪PickerImage.allowsEditing=YES;//自代理PickerImage.delegate=self;//頁面跳轉(zhuǎn)[selfpresentViewController:PickerImage animated:YEScompletion:nil];
運(yùn)行效果如圖:
