UIScrollViewのコンテンツ全体のスクリーンショットを撮る
2021/01/12
UIViewのメソッド1発だけでは無理みたい。中身が全て見えるようにサイズ変更してから撮影する原始的な方法になります。データが非同期処理の場合は工夫が必要かも。
extension UIImage {
convenience init(view: UIView) {
let image = UIGraphicsImageRenderer(bounds: view.bounds).image { context in
view.layer.render(in: context.cgContext)
}
guard let cgImage = image.cgImage else {
self.init()
return
}
self.init(cgImage: cgImage)
}
convenience init(scrollView: UIScrollView) {
let savedFrame = scrollView.frame
let savedContentOffset = scrollView.contentOffset
let savedHorizontalScroll = scrollView.showsHorizontalScrollIndicator
let savedVerticalScroll = scrollView.showsVerticalScrollIndicator
defer {
scrollView.frame = savedFrame
scrollView.contentOffset = savedContentOffset
scrollView.showsHorizontalScrollIndicator = savedHorizontalScroll
scrollView.showsVerticalScrollIndicator = savedVerticalScroll
}
scrollView.showsHorizontalScrollIndicator = false
scrollView.showsVerticalScrollIndicator = false
scrollView.contentOffset = .zero
scrollView.frame = CGRect(origin: .zero, size: scrollView.contentSize)
self.init(view: scrollView)
}
}
手っ取り早いscrollView.toImage()のようなメソッドではなく、面倒でもUIImageを初期化する方が、引数が増えても分かりやすいので気に入っています。