Снимок экрана без панели инструментов - PullRequest
0 голосов
/ 16 мая 2019

У меня есть панель инструментов с кнопкой скриншота. Это прекрасно работает, но я хочу сделать скриншот без панели инструментов. Я пробовал код, который нашел на SO, но изображение огромно, и я не могу сказать, из чего состоит скриншот, так как он выглядит только для скриншота в верхнем левом углу. У меня также есть другая функция в другой части приложения, которая позволяет отправлять снимки экрана по электронной почте. Это огромно, когда оно читается, поэтому я изменяю его размер, прежде чем прикреплять к письму. Это хорошо работает, но я не уверен, как изменить размер и затем обрезать снимок экрана без панели инструментов (выделено красным):

screenshotImage1

Я бы хотел сделать скриншот без панели инструментов. Я все еще учусь, поэтому я поиграл с 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)
                }
        })

1 Ответ

1 голос
/ 16 мая 2019

Используйте takeSnapshot (с: завершенииHandler:) метод для создания снимка 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)
            }
        }
    }
}
...