Posted at

Swift ScrollViewのすべての画面をイメージに保存してシェアする方法

More than 1 year has passed since last update.


ScrollViewの内容をすべてイメージに保存してシェアする方法


以下のサンプルはラベル(タイトル)とテキストビュー(サブタイトル)及び動的に増えるデータを表示するScrollViewをイメージ化するコード


qiita.rb

/*

scrollViewの全てをイメージにしてリターン
*/

func getImageFromScrollView()->UIImage{

var image = UIImage();
var cSize = self.scrollView.contentSize
cSize.width = self.scrollView.frame.width
cSize.height = cSize.height + self.mainTitleLabel.frame.size.height + self.subTitleText.frame.size.height

//第一引数では「図形の大きさ」を設定できます。
//第二引数「opaque」では、イメージの透過を設定することができます。
//値は、Bool型で「true -> 透過値なし」「false -> 透過値あり」というように設定できます。
//第三引数には「scale」が入ります。デバイスの解像度によってイメージをどのように描画するかの設定らしいです。
UIGraphicsBeginImageContextWithOptions(cSize, false, UIScreen.main.scale)

//スクロールの元情報を保存
let savedContentOffset = self.scrollView.contentOffset;
let savedFrame = self.scrollView.frame;

self.scrollView.contentOffset = CGPoint.zero;

//スクロールのサイズをコンテンツサイズに変更
self.scrollView.frame = CGRect(x: 0, y: 150, width: cSize.width, height: cSize.height)

//イメージにしようとする仮のビュを生成
let tempView = UIView(frame: CGRect(x: 0, y: 150, width: cSize.width, height: cSize.height))

let tempSuperView = self.scrollView.superview
self.scrollView.removeFromSuperview()
//イメージにしたいコントロールを仮のビュに追加
tempView.addSubview(self.mainTitleLabel)
tempView.addSubview(self.subTitleText)
tempView.addSubview(self.scrollView)

//contextにスクリーンショットを書き込む
tempView.layer.render(in: UIGraphicsGetCurrentContext()!)

//contextUIImageに書き出す
image = UIGraphicsGetImageFromCurrentImageContext()!;

//元のデータから復帰
tempView.subviews[0].removeFromSuperview()
tempSuperView?.addSubview(self.mainTitleLabel)
tempSuperView?.addSubview(self.subTitleText)
tempSuperView?.addSubview(self.scrollView)

//元のデータから復帰
self.scrollView.contentOffset = savedContentOffset;
self.scrollView.frame = savedFrame;

//context処理終了
UIGraphicsEndImageContext();

return image
}

/// シェア処理
///
/// - Parameter sender: <#sender description#>
@IBAction func shareAction(_ sender: UIButton) {

let image = getImageFromScrollView()
let items = [image] as [Any]

let activityVC = UIActivityViewController(activityItems: items, applicationActivities: nil)

present(activityVC, animated: true, completion: nil)

}