【问题标题】:Screenshot without toolbar in view视图中没有工具栏的屏幕截图
【发布时间】:2019-05-17 10:46:48
【问题描述】:

我有一个带有屏幕截图按钮的工具栏。这很好用,但我想在没有工具栏的情况下截取屏幕截图。我已经尝试过在 SO 上找到的代码,但是图像很大,我不知道屏幕截图是什么,因为它似乎只截取了左上角。我在应用程序的不同部分还有另一个功能,可让您通过电子邮件发送屏幕截图。当它被读入时,它是巨大的,所以我在附加到电子邮件之前调整它的大小。这很好用,但我不确定如何调整大小,然后在没有工具栏的情况下裁剪屏幕截图(以红色突出显示):

我想截取不带工具栏的屏幕截图。我还在学习,所以我玩过 UIImage 和 CGRect,但没有成功。

        let imageScreenshot = view.snapshot()

        let screenWidth = self.view.frame.size.width
        let screenHeight = self.view.frame.size.height
        let cropSize = CGRect(x: 0.0, y: 0.0, width: screenWidth, height: screenHeight * 0.75)
        let imageHolder = imageScreenshot.cgImage?.cropping(to: cropSize)
        let screenshotOfWindow = UIImage(cgImage: imageHolder!)

extension UIView {
    func snapshot() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, UIScreen.main.scale)
        self.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        return img
    }
}

建议用webkit截图后:

        webView!.takeSnapshot(with: nil, completionHandler: { (image, error) in
                self.screenshotOfWindow = image
                self.showScreenshotEffect()
        })

实际上,在此更改后,它似乎并没有保存到 Core Data,但已拍摄快照。

此代码命中第一行并绕过所有其他代码:

 webView.takeSnapshot(with: nil, completionHandler: { (image,error) in
            if let image = image {
                DispatchQueue.main.async {
                    self.webView.isHidden = true
                    self.screenshotOfWindow = image
                    }
                } else {
                    print (error?.localizedDescription as Any)
                }
        })

【问题讨论】:

  • 显示你尝试过的代码
  • 你在使用 webview 吗?
  • 我正在使用 webview。

标签: swift uiview screenshot


【解决方案1】:

使用takeSnapshot(with:completionHandler:) 方法拍摄wkwebview 的快照。并使用完成块在后台线程中运行。所以在主线程中更改图像。

class ViewController: UIViewController {
    @IBOutlet weak var webView: WKWebView!
    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        webView.load(URLRequest(url: URL(string: "https://www.facebook.com")!))

    }
    @IBAction func buttonAction(_ sender: UIButton) {
        webView.takeSnapshot(with: nil) { (image, error) in
            if let image = image {
                DispatchQueue.main.async {
                    self.webView.isHidden = true
                    self.imageView.image = image
                }
            } else {
                print(error?.localizedDescription)
            }
        }
    }
}

【讨论】:

  • 好的。这是行不通的。我现在得到空白图像,但该功能似乎正在工作:
  • @Nutrion 在 webview 加载后调用这个方法
  • 更正:快照不工作。我会继续玩它并报告。
  • 如果我保存到相机胶卷,这有效,但尝试将屏幕截图保存到 UIImage 时它不起作用
  • @Nutrion 您应该使用主线程来更改图像。检查更新的答案
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多