Skip to content
This repository has been archived by the owner on Jan 10, 2025. It is now read-only.

Commit

Permalink
Add methods to get image from UI/NSView
Browse files Browse the repository at this point in the history
  • Loading branch information
Reda Lemeden committed Nov 16, 2015
1 parent 708b45a commit a181d34
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 10 deletions.
24 changes: 16 additions & 8 deletions Verbena.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@
00175BD41B23BE1A00EB3106 /* Verbena.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00175BC81B23BE1900EB3106 /* Verbena.framework */; };
00175BEE1B23BF0D00EB3106 /* VerbenaMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 00175BED1B23BF0D00EB3106 /* VerbenaMac.h */; settings = {ATTRIBUTES = (Public, ); }; };
00175BF41B23BF0D00EB3106 /* Verbena.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00175BE91B23BF0D00EB3106 /* Verbena.framework */; };
00175BFB1B23BF0D00EB3106 /* NSImageExtensionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00175BFA1B23BF0D00EB3106 /* NSImageExtensionSpec.swift */; };
00175BFB1B23BF0D00EB3106 /* NSImageRenderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00175BFA1B23BF0D00EB3106 /* NSImageRenderSpec.swift */; };
00175C0A1B23C1A400EB3106 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00175C091B23C1A400EB3106 /* UIImage.swift */; };
00175C131B23C1F200EB3106 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00175C121B23C1F200EB3106 /* QuartzCore.framework */; };
00175C151B23C1F900EB3106 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00175C141B23C1F900EB3106 /* QuartzCore.framework */; };
00175C181B23C25800EB3106 /* UIImageExtensionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00175C171B23C25800EB3106 /* UIImageExtensionSpec.swift */; };
00175C181B23C25800EB3106 /* UIImageRenderSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00175C171B23C25800EB3106 /* UIImageRenderSpec.swift */; };
00C55AFD1B23DCF600540255 /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C55AFC1B23DCF600540255 /* NSImage.swift */; };
00C55B051B248FC000540255 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C55B031B248F5C00540255 /* Helpers.swift */; };
00C7BCE61BFA9B6900753006 /* UIImageWithViewSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C7BCE51BFA9B6900753006 /* UIImageWithViewSpec.swift */; };
00C7BCE81BFAA0A900753006 /* NSImageWithViewSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C7BCE71BFAA0A900753006 /* NSImageWithViewSpec.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -69,13 +71,15 @@
00175BED1B23BF0D00EB3106 /* VerbenaMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VerbenaMac.h; sourceTree = "<group>"; };
00175BF31B23BF0D00EB3106 /* VerbenaMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VerbenaMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
00175BF91B23BF0D00EB3106 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
00175BFA1B23BF0D00EB3106 /* NSImageExtensionSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImageExtensionSpec.swift; sourceTree = "<group>"; };
00175BFA1B23BF0D00EB3106 /* NSImageRenderSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImageRenderSpec.swift; sourceTree = "<group>"; };
00175C091B23C1A400EB3106 /* UIImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImage.swift; sourceTree = "<group>"; };
00175C121B23C1F200EB3106 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
00175C141B23C1F900EB3106 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
00175C171B23C25800EB3106 /* UIImageExtensionSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageExtensionSpec.swift; sourceTree = "<group>"; };
00175C171B23C25800EB3106 /* UIImageRenderSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageRenderSpec.swift; sourceTree = "<group>"; };
00C55AFC1B23DCF600540255 /* NSImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSImage.swift; sourceTree = "<group>"; };
00C55B031B248F5C00540255 /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = "<group>"; };
00C7BCE51BFA9B6900753006 /* UIImageWithViewSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageWithViewSpec.swift; sourceTree = "<group>"; };
00C7BCE71BFAA0A900753006 /* NSImageWithViewSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSImageWithViewSpec.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -158,7 +162,8 @@
00175BD71B23BE1A00EB3106 /* VerbenaTests */ = {
isa = PBXGroup;
children = (
00175C171B23C25800EB3106 /* UIImageExtensionSpec.swift */,
00175C171B23C25800EB3106 /* UIImageRenderSpec.swift */,
00C7BCE51BFA9B6900753006 /* UIImageWithViewSpec.swift */,
00C55B031B248F5C00540255 /* Helpers.swift */,
00175BD81B23BE1A00EB3106 /* Supporting Files */,
);
Expand Down Expand Up @@ -194,7 +199,8 @@
00175BF71B23BF0D00EB3106 /* VerbenaMacTests */ = {
isa = PBXGroup;
children = (
00175BFA1B23BF0D00EB3106 /* NSImageExtensionSpec.swift */,
00175BFA1B23BF0D00EB3106 /* NSImageRenderSpec.swift */,
00C7BCE71BFAA0A900753006 /* NSImageWithViewSpec.swift */,
00175BF81B23BF0D00EB3106 /* Supporting Files */,
);
path = VerbenaMacTests;
Expand Down Expand Up @@ -417,8 +423,9 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
00C7BCE61BFA9B6900753006 /* UIImageWithViewSpec.swift in Sources */,
00C55B051B248FC000540255 /* Helpers.swift in Sources */,
00175C181B23C25800EB3106 /* UIImageExtensionSpec.swift in Sources */,
00175C181B23C25800EB3106 /* UIImageRenderSpec.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -434,7 +441,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
00175BFB1B23BF0D00EB3106 /* NSImageExtensionSpec.swift in Sources */,
00C7BCE81BFAA0A900753006 /* NSImageWithViewSpec.swift in Sources */,
00175BFB1B23BF0D00EB3106 /* NSImageRenderSpec.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
13 changes: 13 additions & 0 deletions Verbena/Extensions/UIImage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,17 @@ extension UIImage {
drawingBlockWithSize(size)
return UIGraphicsGetImageFromCurrentImageContext()
}

/// Renders a `UIImage` instance from a `UIView`.
///
/// :param: view The view that will be snapshot.
///
/// :returns: A newly rendered snapshot of the view.
public class func imageWithView(view: UIView) -> UIImage {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
10 changes: 10 additions & 0 deletions VerbenaMac/Extensions/NSImage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,14 @@ extension NSImage {
image.unlockFocus()
return image
}

/// Renders an `NSImage` instance from a `NSView`.
///
/// :param: view The view that will be snapshot.
///
/// :returns: A newly rendered snapshot of the view.
public class func imageWithView(view: NSView) -> NSImage {
let image = NSImage(data: view.dataWithPDFInsideRect(view.bounds)) ?? NSImage(size: view.bounds.size)
return image
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import AppKit.NSImage
import Verbena
import XCTest

class NSImageTests: XCTestCase {
class NSImageRenderTests: XCTestCase {
var image: NSImage!

override func setUp() {
Expand Down
20 changes: 20 additions & 0 deletions VerbenaMacTests/NSImageWithViewSpec.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import AppKit.NSImage
import Verbena
import XCTest

class NSImageWithViewTests: XCTestCase {
var image: NSImage!

override func setUp() {
super.setUp()

let view = NSView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.redColor().CGColor
image = NSImage.imageWithView(view)
}

func testImageIsDrawnInContext() {
XCTAssertEqual(image.size.width, 100)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import UIKit.UIImage
import Verbena
import XCTest

class NSImageTests: XCTestCase {
class UIImageRenderTests: XCTestCase {
var image: UIImage!

override func setUp() {
Expand Down
23 changes: 23 additions & 0 deletions VerbenaTests/UIImageWithViewSpec.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import UIKit.UIImage
import Verbena
import XCTest

class UIImageWithViewTests: XCTestCase {
var image: UIImage!

override func setUp() {
super.setUp()

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = UIColor.redColor()
image = UIImage.imageWithView(view)
}

func testImageIsDrawnInContext() {
XCTAssertEqual(image.size.width, 100)
}

func testImageIgnoresAlpha() {
XCTAssertFalse(imageHasAlpha(image))
}
}

0 comments on commit a181d34

Please sign in to comment.