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