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

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

Стандартная технология моментального снимка – 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()

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

  • как я могу очистить содержимое UIWebView / WKWebView?
  • didFinishNavigation не называется
  • allowBackForwardNavigationGestures = true не работает в xcode 7.1
  • Полный URL WKWebView
  • Поддержка HTTP-прокси с помощью WKWebView
  • WKWebview, вводящий cookie-заголовок, вызывает цикл перенаправления
  • WKWebView предоставляет SecurityError при связывании html и javascript с приложением
  • Как удалить кеш WKWebview в iOS8?
  • Совместное использование файлов cookie между несколькими WKWebViews
  • Использование пользовательских шрифтов в WKWebView
  • Добавьте параметр в строку запроса всех URL-адресов, загруженных в WKWebView
  • Interesting Posts

    Изменение размеров ячеек UICollectionView при удалении элементов с помощью оцененного объекта ItemSize

    Подкласс AFHTTPSessionManager: Post API с телом.

    Приложение не может найти порт AVAudio BluetoothHFP Handsfree Swift

    Выход из входного списка AccessViewView после закрытия клавиатуры

    UIRefreshControl перестает вращаться после того, как приложение неактивно

    xcode «Действительный профиль подготовки для этого исполняемого файла не найден»

    Подтверждение текста абзаца UILabel

    Проверьте, включено ли на устройстве iTunes Match

    Жесты перетаскивания / панорамирования в GMSMapView не получаются после обновления до SDK 1.3.1

    UITextView с редактированием смайликов

    UITextView: обнаружение ссылок работает в симуляторе, а не на устройстве

    iOS – UINavigationController, Hide navigationBar

    swift willSet didSet и получить заданные методы в свойстве

    приложение iOS с основными данными, фотографиями и iCloud

    Почему SKSpriteNode не отвечает на applyForce или applyImpulse?

    Давайте будем гением компьютера.