Снимок UIView неправильно масштабируется?

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

Я хочу, чтобы снимок выглядел точно так, как он выглядит на экране iPhone. Таким образом, если часть фигуры выходит за пределы экрана, на снимке будет запечатлена только та часть фигуры, которая видна на экране. Я также хочу, чтобы снимок имел размер canvas, который в основном соответствует размеру представления, за исключением немного меньшей высоты:

canvas = UIView(frame: CGRectMake(0, 0, view.bounds.height, view.bounds.height-toolbar.bounds.height))

Если бы кто-нибудь мог сказать, что я делаю неправильно при создании снимка, я был бы очень признателен!

Мой код:

func share(sender: UIBarButtonItem) {
    let masterpiece = canvas.snapshotViewAfterScreenUpdates(true)
    let image = snapshot(masterpiece)

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

func snapshot(masterpiece: UIView) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(masterpiece.bounds.size, false, UIScreen.mainScreen().scale)
    masterpiece.drawViewHierarchyInRect(masterpiece.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image

}

person 14wml    schedule 04.01.2016    source источник


Ответы (1)


В первую очередь я бы попробовал сделать снимок UIWindow, чтобы посмотреть, решит ли это вашу проблему:

Вот расширение UIWindow, которое я использую (не специально для работы с камерой) — попробуйте.

import UIKit

extension UIWindow {

  func capture() -> UIImage {

      UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, UIScreen.mainScreen().scale)
      self.layer.renderInContext(UIGraphicsGetCurrentContext()!)
      let image = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext()

      return image
  }

}

Я называю это так:

let window: UIWindow! = UIApplication.sharedApplication().keyWindow

let windowImage = window.capture()
person Damo    schedule 04.01.2016