大牛请绕道!!!
开发过程中我们会遇到,保存屏幕界面、整个滚动视图、webView等等,你还可能会遇到失真的麻烦,本文提供一下我工程中使用的方法。
获取当前的屏幕的视图
核心方法
- (void)renderInContext:(CGContextRef)cox;
官方解释:
/* Renders the receiver and its sublayers into 'ctx'. This method renders directly from the layer tree. Renders in the coordinate space of the layer.
WARNING: currently this method does not implement the full CoreAnimation composition model, use with caution. */
把layer层渲染的内容放到指定的上下文
UIGraphicsBeginImageContext(currentView.bounds.size); //currentView 当前的view 创建一个基于绘图的图形上下文并指定大小为当前视图的bounds
[currentView.layer renderInContext:UIGraphicsGetCurrentContext()];//renderInContext呈现接受者及其子范围到指定的上下文
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();//返回一个基于当前图形上下文的图片
UIGraphicsEndImageContext();//移除栈顶的基于当前位图的图形上下文
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);//然后将该图片保存到图片图
这样还不算结束,我想获取滚动视图的截图,你想到怎么办了吗?
说一下思路,想法获取整个滚动视图的layer层,layer层的大小取决于frame,不是contentSize
UIImage* image = nil;
UIGraphicsBeginImageContext(scrollView.contentSize);
{//重点,既要获取整个scrollerView,又要保证不破环界面本身
CGPoint savedContentOffset = scrollView.contentOffset;
CGRect savedFrame = scrollView.frame;
scrollView.contentOffset = CGPointZero;
scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
image = UIGraphicsGetImageFromCurrentImageContext();
scrollView.contentOffset = savedContentOffset;
scrollView.frame = savedFrame;
}//
UIGraphicsEndImageContext();
你以为这样就结束了吗?no,no。原因这样获取的的视图是会失真的,解决办法如下
使用
UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, scrollView.opaque, 0.0);//scrollView.opaque或者NO保证不失真
替换
UIGraphicsBeginImageContext(scrollView.contentSize);
保存图片的方法,很多就不写了。