Как сделать снимок экрана части UIView?

Я хочу, чтобы пользователь заходил в мое приложение и снимал снимок экрана после нажатия кнопки программно в Swift. Я знаю, что UIGraphicsGetImageFromCurrentImageContext() снимает скриншот, но мне не нужен снимок всего экрана. Я хочу, чтобы прямоугольник всплывал (вроде как инструмент обрезки), и пользователь может перетаскивать и изменять размер прямоугольника, чтобы сделать снимок экрана только определенной части экрана. Я хочу, чтобы прямоугольник проходил через WKWebView и WKWebView изображение веб-представления.

2 Solutions collect form web for “Как сделать снимок экрана части UIView?”

Стандартная технология моментального снимка – drawViewHierarchyInRect . И чтобы получить часть изображения, вы можете использовать CGImageCreateWithImageInRect .

Таким образом, в Swift 2:

 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) } } 

В Swift 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, 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 } 

Это ранее заданный вопрос о том, как захватить UIView для UIImage без потери качества на дисплее сетчатки, но для быстрого развертывания (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()

Имейте в виду, что это грубо и, вероятно, нуждается в дальнейшем изучении безопасности потоков и т. Д ….

  • Как я могу правильно выполнить проверку подлинности с помощью WKWebView?
  • WKWebView Cookies
  • Клавиша «done» нажала кнопку для UIWebView и WKWebView
  • WKWebView не показывает содержимое «под экраном»
  • копирование файлов cookie между WKWebView и HTTPCookieStorage - не поиск 302 файлов cookie
  • Разрешить непроверенные сертификаты ssl в WKWebView
  • com.apple.WebKit.WebContent drop 113 error: Не удалось найти указанную службу
  • Как удалить кеш WKWebview в iOS8?
  • WkWebView не загрузитHTMLstring
  • Поддерживает ли webKit в iOS 11 (бета) поддержку WebRTC?
  • Установить useragent в WKWebview
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.