質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1871閲覧

画面中央のスクリーンショットを撮りたい。

shuhei-cyf

総合スコア15

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/11/12 08:41

編集2019/11/12 11:18

###実現したいこと
画面中央のスクリーンショットを撮りたい。

###該当するコード

Swift

1 func takeScreenShot() { 2 3 let width = CGFloat(UIScreen.main.bounds.size.width) 4 let height = CGFloat(UIScreen.main.bounds.size.height/1.3) 5 let size = CGSize(width: width, height: height) 6 7 UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 8 9 self.view.drawHierarchy(in: view.bounds, afterScreenUpdates: true) 10 screenShotImage = UIGraphicsGetImageFromCurrentImageContext()! 11 UIGraphicsEndImageContext() 12 13 }

heightを1/1.3にして試してみたのですが、これだとスクショが上寄りになってしまうようです。同じ高さで画面の中央を撮ることは可能でしょうか?

###追記
更新したコード

Swift

1 func takeScreenShot() { 2 3 let size = CGSize(width: CGFloat(UIScreen.main.bounds.size.width), height: CGFloat(UIScreen.main.bounds.size.height/1.3)) 4 let rect = CGRect(origin: CGPoint.zero, size: size) 5 let height = UIScreen.main.bounds.size.height 6 // 上下の余白が同じサイズになる値を計算 7 let startWith = (height - (height/1.3)) / 2 8 if let context = UIGraphicsGetCurrentContext() { 9 context.translateBy(x: 0, y: -startWith) 10 context.fill(rect) 11 } 12 13 self.view.drawHierarchy(in: view.bounds, afterScreenUpdates: true) 14 screenShotImage = UIImage(cgImage: (UIGraphicsGetCurrentContext()?.makeImage())!) 15 UIGraphicsEndImageContext() 16 }

エラーメッセージ

[Unknown process name] CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

試してみましたが、以下のコードでたぶん期待通りになったのではないかと思います。

swift

1 func takeScreenShot() { 2 3 let width = view.bounds.width 4 let height = view.bounds.height / 1.3 5 let size = CGSize(width: width, height: height) 6 7 UIGraphicsBeginImageContextWithOptions(size, false, 0.0) 8 9 self.view.drawHierarchy(in: view.bounds.offsetBy(dx: 0, dy: -(view.bounds.height - height) / 2), afterScreenUpdates: true) 10 let screenShotImage = UIGraphicsGetImageFromCurrentImageContext()! 11 UIGraphicsEndImageContext() 12 13 UIImageWriteToSavedPhotosAlbum(screenShotImage, nil, nil, nil) 14 }

drawHierarchyのin引数で描画先の矩形を指定するようなので、そこを上にずらした感じです。

投稿2019/11/13 00:51

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shuhei-cyf

2019/11/14 11:26

うまくできました! ありがとうございます。
guest

0

UIGraphicsBeginImageContextWithOptionsの代わりにUIGraphicsGetCurrentContextを使って、描画位置を調整することでできるかなと思います。(すみません、動作確認してません。。)

swift

1UIGraphicsBeginImageContextWithOptions(size, false, 0.0)

上記の部分を下記のように書き換える

swift

1let rect = CGRect(origin: CGPoint.zero, size: size) 2let height = UIScreen.main.bounds.size.height 3// 上下の余白が同じサイズになる値を計算 4let startWith = (height - (height/1.3)) / 2 5if let context = UIGraphicsGetCurrentContext() { 6 context.translateBy(x: 0, y: -startWith) 7 context.fill(rect) 8}

投稿2019/11/12 10:14

KaiShoya

総合スコア551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shuhei-cyf

2019/11/12 11:20

コードを変更したところ、screenShotImage = UIImage(cgImage: (UIGraphicsGetCurrentContext()?.makeImage())!)の部分でエラーが発生しています。(追記しました) CGContext→CGImage→UIImageと変えたのがまずいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問