Skip navigation.
 
mlRe: Drawing views into NSImage
FROM : John C. Randolph
DATE : Mon Apr 04 20:13:17 2005

On Apr 3, 2005, at 11:27 PM, Geert B. Clemmensen wrote:

> Hello,
>
> I have N views (or more specifically, N subviews of a content view 
> that holds M subviews with M >= N). I want to draw these N views 
> into an NSImage. I calculate the proper rect and initializes an 
> NSImage instance accordingly, i.e. its size matches that of the 
> calculated rect. I then do:
>
>    [myImage lockFocus];
>        // fill the image with clearColor
>        // draw the N views via drawRect: calls
>    [myImage unlockFocus];
>
> This kinda works, i.e. I get an NSImage that almost looks right, 
> but I haven't been able to consistently have the N views draw so 
> their relative position to each other is kept. I have tried enough 
> variants of NSAffineTransform with -concat/-set (with and without 
> save/restoreGraphicsState) to realize that this may not be the way 
> to go. What is the recommended/preferred way to change the 
> coordinate system before each call to drawRect:?
>
> I believe I have googled and otherwise searched the topic quite 
> extensively, but haven't yet found a solution. Any pointers will be 
> highly appreciated.


What's tripping you up here is most likely the fact that when the 
drawing desination isn't an NSView, NSView's bounds and frame 
manipulation methods are no-ops.

I would expect that when you tried to draw more than one view on the 
same image, they all tried to draw in the lower-left corner?

If the  view in question is visible in a window on screen, you should 
be able to get what you want with NSBitmapImageRep's -
initWithFocusedViewRect:, or NSView's -dataWithPDFInsideRect: 
methods.  If the view isn't in a window already, then  what you'll 
need to do is draw the views in their view hierarchy order, and 
manually set up the coordinate space (and clipping) before  drawing 
each one.  To find out where to put the origin, you can probably just 
send -convertPoint:toView: to each subview you want to draw, and 
discover any scaling using -convertSize:toView: using a size of 
{ 1.0,  1.0 }.

-jcr


John C. Randolph <<email_removed>> (408) 974-8819
Sr. Cocoa Software Engineer,
Apple Worldwide Developer Relations
http://developer.apple.com/cocoa/index.html

Related mailsAuthorDate
mlDrawing views into NSImage Geert B. Clemmense… Apr 4, 08:27
mlRe: Drawing views into NSImage Ricky Sharp Apr 4, 13:11
mlRe: Drawing views into NSImage Matt Gough Apr 4, 15:04
mlRe: Drawing views into NSImage John C. Randolph Apr 4, 20:13
mlRe: Drawing views into NSImage Geert B. Clemmense… Apr 5, 10:03