Thank you Fritz. I am afraid your method doesn't work in my case.
Me too I need to draw a rounded rect path with shadow. But its background
has an half-a-transparent color. So if I "stroke" the bezierPath (to cast
the shadow) I can quite see the path as a line. If I "fill" the bezierPath
(to cast the shadow)  I mix the whiteColor (or any other) with the
background color. And I cannot cast a shadow filling a path with a
clearColor.
I am puzzled.

Regards
-- Leonardo


> Da: Fritz Anderson <fri...@manoverboard.org>
> Data: Tue, 31 Dec 2013 10:31:45 -0600
> A: Leonardo <mac.iphone....@gmail.com>
> Cc: Cocoa Developers <cocoa-dev@lists.apple.com>
> Oggetto: Re: NSShadow with [bezierPath addClip]
> 
> On 31 Dec 2013, at 6:15 AM, Leonardo <mac.iphone....@gmail.com> wrote:
> 
>> In my NSView subclass, I have to draw an image within a bezierPath and apply
>> an NSShadow to the result.
>> So within the drawRect: method I add
>> 
>>     [bezierPath addClip];
>>     [mImage drawInRect:inRect fromRect:fromRect
>> operation:NSCompositeSourceOver fraction:mOpacity];
>> 
>> It works. The image gets clipped by the path.
>> Now I would like to apply the NSShadow to the result, so before those lines
>> above I add
>> 
>> [bezierPath addClip];
>> [mShadow set];
>> [mImage drawInRect:inRect fromRect:fromRect operation:NSCompositeSourceOver
>> fraction:mOpacity];
>> 
>> I can't get the shadow drawn because the bezierPath is clipping the drawing
>> area where the shadow should fall.
>> How to solve this trouble?
>> I have tried to use a layer, but I get weird results when I resize, rotate
>> and modify other parameters of the view.
> 
> This worked for me:
> 
> ====
> - (void) drawRect:(NSRect)dirtyRect
> {
>     NSBezierPath *      bezierPath = [[NSBezierPath alloc] init];
>     [bezierPath appendBezierPathWithRoundedRect: self.clipPathRect
>                                         xRadius: 10.0 yRadius: 10.0];
> 
>     [bezierPath setLineWidth: 0.0];
> 
>     NSGraphicsContext *     context = [NSGraphicsContext
>                                        graphicsContextWithWindow:
> self.window];
> 
>     //  Clear the view
>     [context saveGraphicsState]; {
>         [[NSColor whiteColor] set];
>         [NSBezierPath fillRect: dirtyRect];
>     } [context restoreGraphicsState];
> 
>     //  Stroke the (zero-width) clipping path
>     [context saveGraphicsState]; {
>         [self.shadow set];
>         [bezierPath stroke];
>         //  No width means no visible boundary line,
>         //  but the shadow is still drawn.
>     } [context restoreGraphicsState];
> 
>     //  Draw the image, clipped to the path
>     [context saveGraphicsState]; {
>         [bezierPath addClip];
>         [_image drawInRect: self.clipPathRect
>                   fromRect: self.selectedSourceRect
>                  operation: NSCompositeSourceOver
>                   fraction: self.imageFraction];
>         //  The image obscures the inner shadow.
>         //  Bug: The shadow shows through to the extent imageFraction < 1.
>         //  Can the shadow drawing be clipped to the inverse of the clipping
> path?
>     } [context restoreGraphicsState];
> }
> ====
> 
> ‹ F
> 



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to