项目开发中的一个需求 ,需要将不在屏幕中的内容也要截图保存到本地相册 ,于是我的思路是:将下面的大的scrollView转化为image,再将image保存相册即可。以下是我的代码:
pragma mark 把scrollView转换成image
- (UIImage *)captureScrollView:(UIScrollView *)scrollView{
UIImage* image = nil;
// 第一个参数表示区域大小。第二个参数表示是否是非透明的,一般传no。第三个参数就是屏幕密度了,关键就是第三个参数
UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, NO, [UIScreen mainScreen].scale);
{
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();
if (image != nil) {
return image;
}
return nil;
}
pragma mark 点击保存图片按钮的实现方法
- (void)saveImageButtonAction:(id)sender{
NSLog(@"点击了保存图片");
UIImage *image = [self captureScrollView:self.bigView];
UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
pragma mark 成功保存图片到相册中, 必须调用此方法, 否则会报参数越界错误
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
NSLog(@"error == %@",error);
if (!error) {
[SVProgressHUD showSuccessWithStatus:@"保存成功"];
} else {
[SVProgressHUD showErrorWithStatus:@"保存失败"];
}
}
最后说一下我在这里遇到的一个坑:大家在设置scrollView的ContentSize时 如果设置宽为0的话,会一直生成image失败,导致保存不成功。宽度改成屏幕的宽度即可。
网友评论