iOS中截取当前的View,并保存为图片

大牛请绕道!!!
开发过程中我们会遇到,保存屏幕界面、整个滚动视图、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);

保存图片的方法,很多就不写了。

你可能感兴趣的:(iOS中截取当前的View,并保存为图片)