起因:
公司項目需要截圖,截長圖
問題:
如何截圖,截長圖,網上的資料往往不是太長,就是沒解決問題,甚至有不少bug。
解決辦法
下面是我找到最精簡的方法
1、截圖
import UIKit
extension UIView {
/// 截屏Image
var captureImage: UIImage? {
// 參數①:截屏區(qū)域 參數②:是否透明 參數③:清晰度
UIGraphicsBeginImageContextWithOptions(frame.size, true, UIScreen.main.scale)
layer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
調用
let image = view.captureImage
2、長圖、大圖
用上個方法可以截普通的view,但是scrollView,tableView不行,
截長屏需要改變frame的size為contentSize進行截圖,操作之后設置回來即可
import UIKit
extension UIScrollView {
/// 截長屏Image
var captureLongImage: UIImage? {
var image: UIImage? = nil
let savedContentOffset = contentOffset
let savedFrame = frame
contentOffset = .zero
frame = CGRect(x: 0, y: 0,
width: contentSize.width,
height: contentSize.height)
UIGraphicsBeginImageContext(frame.size)
UIGraphicsBeginImageContextWithOptions(
CGSize(width: frame.size.width,
height: frame.size.height),
false,
UIScreen.main.scale)
layer.render(in: UIGraphicsGetCurrentContext()!)
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
print("contentSize == \(contentSize)")
contentOffset = savedContentOffset
frame = savedFrame
return image
}
}
調用
let longImage = tableView.captureLongImage
保存圖片
guard let image = tableView.captureLongImage else {
return
}
writeImageToAlbum(image)
fileprivate func writeImageToAlbum(_ image: UIImage) {
MQProgressHUD.showLoading()
UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)
}
@objc fileprivate func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafeRawPointer) {
if let _ = error as NSError? {
print("保存失敗,請重試")
} else {
print("保存成功!")
}
}
}