Skip to content

Instantly share code, notes, and snippets.

@nitrag
Created November 21, 2016 05:16
Show Gist options
  • Save nitrag/b3117a4b6b8e89fdbc12b98029cf98f8 to your computer and use it in GitHub Desktop.
Save nitrag/b3117a4b6b8e89fdbc12b98029cf98f8 to your computer and use it in GitHub Desktop.
This will allow you to take a screenshot of a UIView, but more importantly only a section of that view
//
// Screenshot.swift
//
// 1) Take a picture of a UIView
// 2) Take a picture of a UIView's subframe. EG. Fullscreen UIView with a
// small square box in the middle, it will only save what's visible in the box frame
// but not the box itself
import Foundation
import UIKit
extension UIView {
class func image(view: UIView, subview: UIView? = nil) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0)
view.drawHierarchy(in: view.frame, afterScreenUpdates: true)
var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
if(subview != nil){
var rect = (subview?.frame)!
rect.size.height *= image.scale //MOST IMPORTANT
rect.size.width *= image.scale //TOOK ME DAYS TO FIGURE THIS OUT
let imageRef = image.cgImage!.cropping(to: rect)
image = UIImage(cgImage: imageRef!, scale: image.scale, orientation: image.imageOrientation)
}
return image
}
func image() -> UIImage? {
return UIView.image(view: self)
}
func image(withSubview: UIView) -> UIImage? {
return UIView.image(view: self, subview: withSubview)
}
}
@Tinklefinger
Copy link

THANK YOU NITRAG!

One correction for taking image over subview is to adjust the origin point too:
rect.origin.x = subview.frame.origin.x * image.scale rect.origin.y = subview.frame.origin.y * image.scale

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment