2016-03-10?Steven?WeAreTheBest
首先我們要說的是,iOS 里截屏的功能本質(zhì),其實(shí)是將整個(gè)屏幕”畫"出來
所以,我們需要使
drawToContext 這個(gè)方法
不過首先,我們來設(shè)置一下 Xcode ?的 storyboard,
/把某個(gè)View的內(nèi)容畫成一張圖片
- (UIImage*)drawToContext:(UIView*)view{
//1.開啟上下文
UIGraphicsBeginImageContext(view.frame.size);
//2.繪制圖形
CGContextRefctx =UIGraphicsGetCurrentContext();
//把layer上的內(nèi)容繪制到上下文當(dāng)中
[view.layerrenderInContext:ctx];
UIImage*newImage =UIGraphicsGetImageFromCurrentImageContext();
//3.關(guān)閉上下文
UIGraphicsEndImageContext();
returnnewImage;
因?yàn)樯蓤D片后我們還需要保存圖片,但是圖片需要保存在系統(tǒng)內(nèi)的相冊(cè)里的,蘋果將保存圖片的方法統(tǒng)一成一個(gè)方法,下面第二個(gè)就是蘋果給的方法,
UIImage*image = [selfdrawToContext:self.view];
//4.把圖片保存到相冊(cè)里面
//圖片-代理-回調(diào)方法-上下文
UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);
注意,在這個(gè)方法里,我們還調(diào)用了一個(gè)新方法@selector(image:didFinishSavingWithError:contextInfo:)
它的方法全名是
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{
if(error) {
NSLog(@"保存失敗");
}else{
NSLog(@"保存成功");
}
}
這個(gè)方法是幫助我們判斷系統(tǒng)是否保存成功的,由此可見, iOS 系統(tǒng)的交互在處理這些細(xì)節(jié)的時(shí)候都是十分優(yōu)異,精益求精.
開始截屏
OK, 講完了全屏幕截屏,我們來說一下,選擇區(qū)域截屏
好啦!
首先設(shè)置,一下基礎(chǔ) UI 界面
@property(nonatomic,strong)UIImageView*imageView;
再初始化懶加載一下,設(shè)置一下 frame 和初始值 ,以及背景圖片
-(UIImageView*)imageView
{
if(_imageView==nil) {
_imageView=[[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"火影"]];
_imageView.frame=self.view.frame;
_imageView.userInteractionEnabled=YES;
}
return_imageView;
}
因?yàn)樵谄聊簧线x擇截屏,我們首先需要 調(diào)用iOS 里的手勢(shì)方法
UIPanGestureRecognizer*pan=[[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(pan:)];
//添加移動(dòng)手勢(shì)
[self.imageViewaddGestureRecognizer:pan];
//再根據(jù)情況判斷 ?手勢(shì)pan 獲得,將 pan的起點(diǎn)和移動(dòng)中的偏移量以及結(jié)束時(shí)候獲取的區(qū)域, 獲取出來,這個(gè)區(qū)域就是
我們要計(jì)算用戶移動(dòng)截取的屏幕區(qū)域
(初始點(diǎn))
-(void)pan:(UIPanGestureRecognizer*)pan
{
if(pan.state==UIGestureRecognizerStateBegan) {
//獲得點(diǎn)擊的起點(diǎn)
self.startP=[panlocationInView:self.view];
UIView*clipView=[[UIViewalloc]init];
clipView.backgroundColor=[UIColorredColor];
clipView.alpha=0.5;
[self.viewaddSubview:clipView];
self.clipView=clipView;
}elseif(pan.state==UIGestureRecognizerStateChanged)
{
//求偏移量
CGPointcurP=[panlocationInView:self.view];
CGFloatoffsetX=curP.x-self.startP.x;
CGFloatoffsetY=curP.y-self.startP.y;
//修改好frame值就好了
self.clipView.frame=CGRectMake(self.startP.x,self.startP.y, offsetX, offsetY);
}elseif(pan.state==UIGestureRecognizerStateEnded)
{
UIImage*image=[selfclipImage:self.imageViewwithClipRect:self.clipView.frame];
self.imageView.image=image;
//刪除多余的部分,就是我們選擇時(shí)候會(huì)加上的那個(gè)紅色透明的clipView-你們也可以不寫,截取的都是沒有紅色的
[self.clipViewremoveFromSuperview];
UIImage*icon=[selfdrawToContext:self.imageView];
UIImageWriteToSavedPhotosAlbum(icon,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);
}
}
最后再重點(diǎn)重復(fù)一下,這兩個(gè)方法,一個(gè)是將屏幕畫出來,一個(gè)是保存到相冊(cè)
UIImage*icon=[selfdrawToContext:self.imageView];
//保存到相冊(cè)
UIImageWriteToSavedPhotosAlbum(icon,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);
#pragma mark-截屏
-(UIImage*)drawToContext:(UIView*)view
{
//1.開始上下文
UIGraphicsBeginImageContext(view.frame.size);
//2.繪制圖形
CGContextRefctx=UIGraphicsGetCurrentContext();
//把layer上的內(nèi)容繪制到圖形上
[view.layerrenderInContext:ctx];
UIImage*newImage=UIGraphicsGetImageFromCurrentImageContext();
//關(guān)閉上下文
UIGraphicsEndImageContext();
returnnewImage;
}
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{
if(error){
NSLog(@"保存失敗");
}else
{
NSLog(@"保存成功");
}
}
最后再獻(xiàn)上我們的效果!