Would the Managing Live Resize methods of NSView 
(https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/#//apple_ref/doc/uid/20000014-SW41)
 be helpful?

The docs for -viewWillStartLiveResize suggest that that would be a good place 
to prepare for a resize instead of trying to manage "how has the size changed" 
decisions in -drawRect:.


On Jan 14, 2015, at 8:39 PM, N!K <pu56ucl...@alumni.purdue.edu> wrote:

> On Jan 13, 2015, at 10:50 PM, Jens Alfke <j...@mooseyard.com> wrote:
> 
>> 
>>> On Jan 13, 2015, at 9:25 PM, N!K <pu56ucl...@alumni.purdue.edu> wrote:
>>> 
>>> A breakpoint at the end of drawRect shows that it runs twice. After the 
>>> second pass, the view appears, as it should.
>>> Between passes, bounds is changed somehow, as shown by NSLog  at the start 
>>> and end of drawRect. 
>>> Since this will upset code that I will add later, I’d like to stop this. 
>> 
>> The view's being resized, probably as part of view layout. Ideally AppKit 
>> shouldn't draw the view before it gets to its final size, but maybe this is 
>> part of an animation, or maybe it's something that hasn't been optimized 
>> 100% in AppKit.
>> 
>> In general, you should not make assumptions about when and how often 
>> -drawRect: will be called. That's up to AppKit. Your job is just to draw the 
>> view when you’re told to.
> 
> OK. Cause is unknown (probably unknowable?) but part of Cocoa. Just because 
> there was only one pass in other projects, I can’t depend on it. drawRect can 
> happen anytime.
> 
>> You haven't said why the bounds change will upset your code; is the view 
>> being changed to the wrong size? That would be an actual problem, but it 
>> isn't related to being drawn multiple times. You'd need to look at the view 
>> constraints in your window to diagnose that.
>> 
>> —Jens
> 
> “Why” takes a little explaining. Thank you for your patience.
> 
> I’m trying to learn more about drawing. One stumbling block was getting an 
> NSBezierPath to change size proportional to the window size when the corner 
> is dragged. Per Graham Cox’s suggestion, the view size change can be detected 
> in subsequent passes of drawRect by comparing 
>       ratioX = NSWidth ([_path bounds])/NSWidth(bounds);
>       ratioY = NSHeight([_path bounds])/NSHeight(bounds);
> with their initial values, which were established in the one pass of drawRect 
> before the view appeared.
> 
> This worked perfectly. I used the ratios in 
> -(void)resize{
>    scaleX = ratioX0/ratioX;
>    scaleY = ratioY0/ratioY;
>        NSAffineTransform* tfm = [[NSAffineTransform alloc] init];
>        [tfm scaleXBy:scaleX yBy:scaleY];
>       temp  = [tfm transformBezierPath:_path];
> }
> The initial view was correct. Then dragging the window corner  induced 
> drawRect’s, which detected the changes and scaled the original _path each 
> time; no cumulative errors. The path size tracked the view size correctly. 
> 
> 
> 
> Next I wanted to learn how to scale the whole view in a new project, not just 
> the NSBezierPath. I was  planning to  later include other objects with the 
> NSBezierPath and wanted them to be scaled, too. I used the same 
> initialization and failed because of the bounds change between two passes, 
> which I failed to anticipate. The first pass set the initial values. The 
> second pass detected the change and scaled the view before the view appeared.
> -(void)resize{
>    scaleX = ratioX0/ratioX;
>    scaleY = ratioY0/ratioY;
>    NSAffineTransform* tfm = [[NSAffineTransform alloc] init];
>    [tfm scaleXBy:scaleX yBy:scaleY];
>    temp  = [tfm transformBezierPath:_path];
> }
> Thus the path in the initial view was quite different from the initial path, 
> and dragging the corner of the window caused wildly incorrect scaling.
> 
> My hope was that there might be a way of suppressing the second pass before 
> display of the view. Now I know better and will figure out another way to 
> initialize and track. Thank you for correcting me.
> 
> Nick


_______________________________________________

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