14wml
14wml

Reputation: 4166

Snapshot of UIView not scaling correctly?

I have a UIView canvas which I would like to save a screen shot of it and it's subviews (which are the colorful shapes) on the camera roll when I press the UIBarButton shareBarButton. This works on the simulator, however, it does not produce the image in the way I like:

I want the snapshot to look exactly like the way it looks on the iPhone screen. So if part of the shape goes beyond the screen, the snapshot will capture only the part of the shape that is visible on screen. I also want the snapshot to have the size of the canvas which is basically the size of the view except slightly shorter height:

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

If someone could tell what I'm doing wrong in creating the snapshot that would be greatly appreciated!

My code:

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

}

Upvotes: 0

Views: 266

Answers (1)

Damo
Damo

Reputation: 12890

In the first instance I would try snap-shotting the UIWindow to see if that solves your issue:

Here is a UIWindow extension I use (not specifically for camera work) - try that.

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
  }

}

I call it like:

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

let windowImage = window.capture()

Upvotes: 1

Related Questions