Swiftでボタンをプログラムした後、ユーザーが自分のアプリに行ってアプリのスクリーンショットを撮ってもらいたい。私はUIGraphicsGetImageFromCurrentImageContext()
がスクリーンショットを取ることを知っていますが、私はスクリーン全体の画像を望んでいません。私は矩形をポップアップ(作物ツールのようなもの)したいと思うし、ユーザーは、画面の特定の部分のみのスクリーンショットを取るために四角形をドラッグしてサイズ変更することができます。矩形をWKWebView
に移動して、Webビューの画像を切り抜きたい。UIViewの一部のスクリーンショットを取る方法は?
6
A
答えて
16
標準スナップショットのテクニックはdrawViewHierarchyInRect
です。画像の一部を取得するには、CGImageCreateWithImageInRect
を使用します。スウィフト2でこのように
、:スウィフト3では
extension UIView {
/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
/// return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.
func snapshot(of rect: CGRect? = nil) -> UIImage? {
// snapshot entire view
UIGraphicsBeginImageContextWithOptions(bounds.size, opaque, 0)
drawViewHierarchyInRect(bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// if no `rect` provided, return image of whole view
guard let rect = rect, let image = wholeImage else { return wholeImage }
// otherwise, grab specified `rect` of image
let scale = image.scale
let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
guard let cgImage = CGImageCreateWithImageInRect(image.CGImage!, scaledRect) else { return nil }
return UIImage(CGImage: cgImage, scale: scale, orientation: .Up)
}
}
:
extension UIView {
/// Create snapshot
///
/// - parameter rect: The `CGRect` of the portion of the view to return. If `nil` (or omitted),
/// return snapshot of the whole view.
///
/// - returns: Returns `UIImage` of the specified portion of the view.
func snapshot(of rect: CGRect? = nil) -> UIImage? {
// snapshot entire view
UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
drawHierarchy(in: bounds, afterScreenUpdates: true)
let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// if no `rect` provided, return image of whole view
guard let image = wholeImage, let rect = rect else { return wholeImage }
// otherwise, grab specified `rect` of image
let scale = image.scale
let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
guard let cgImage = image.cgImage?.cropping(to: scaledRect) else { return nil }
return UIImage(cgImage: cgImage, scale: scale, orientation: .up)
}
}
そして、それを使用するために、あなたが行うことができます:常にロブとして
if let image = webView.snapshot(of: rect) {
// do something with `image` here
}
3
これは以前How to capture UIView to UIImage without loss of quality on retina displayで質問をしますが(2.3)迅速に拡大することです:
extension UIView {
class func image(view: UIView) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
guard let ctx = UIGraphicsGetCurrentContext() else {
return nil
}
view.layer.renderInContext(ctx)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
func image() -> UIImage? {
return UIView.image(self)
}
}
ですから、UIView.image(theView)
でビューから画像を取得したり、ビュー自体let viewImage = self.view.image()
これは荒いと思いますが、糸の安全性などをさらに検討する必要があるかもしれませんが....
関連する問題
- 1. pickerViewControllerとUIViewのスクリーンショットを取る方法は?
- 2. アンドロイドでスクリーンショットのスクリーンショットを取る方法は?
- 3. UIViewの一部のUIGestureRecognizer
- 4. 下のレイアウトのスクリーンショットを取る方法
- 5. iOSのUIViewのスクリーンショットを撮る
- 6. UIViewの一部を透明にする
- 7. Androidサーフェイスビューのスクリーンショットを取る方法
- 8. スクリーンショットのQt/QMLを取る方法
- 9. アプリのウィンドウの一部のスクリーンショットを撮るには?
- 10. Appiumのみを使用してwebview部分のスクリーンショットを取る方法
- 11. UIViewの一部が歪んでいる
- 12. 内部のUIViewの参照方法UITableViewCell
- 13. OTSUスレッシュホールドでイメージの一部のスレッシュホールドを取る方法は?
- 14. UIScrollViewを使用したUIViewのスクリーンショット
- 15. スクリーンショット名を取得する方法
- 16. マップビューからスクリーンショットを取る方法
- 17. jmonkey3でスクリーンショットを取得する方法
- 18. ボタンプレスで部分的にスクリーンショットを取る
- 19. UIViewの内部にカラーホイールを実装する方法は?
- 20. SDL2でテクスチャの一部を取得する方法は?
- 21. numpyでバイナリファイルの一部を読み取る方法は?
- 22. 単一のUIViewにスライドアニメーションを与える方法は?
- 23. VC++でWPFアプリケーションのスクリーンショットを取得する方法は?
- 24. UIViewの最大サイズの取得方法
- 25. UIviewの特定の部分をアニメーション化する方法
- 26. UIViewで特定のサブビューの数を取得する方法は?
- 27. 配列の一部の値を取得する方法
- 28. セルの値の一部を読み取る方法
- 29. XML(iOS)のタグの一部を取得する方法
- 30. SilverStripe:モデルのフィールドの一部を取得する方法
偉大な仕事。ありがとう。 – damirstuhec
完璧なソリューション。 SOには他のものがありますが、画面全体をキャプチャします。これは両方のソリューションです。 – Septronic