Thanks for the tips Fritz,

To address a couple of your points:

* Yes, my 'make the image square' method is a bit of a hack. It really should 
be a fixed size and centred with respect to the textbox I'm drawing attention 
to. That was stage 2 after getting it positioned correctly :)

* Thanks for the reminder to use the string symbol name. Using the string 
literal was a hold over from when I was using my own resource image. IB doesn't 
show NSInvalidFreestandingTemplate in the drop down list of available images so 
I only found it later.

* I took your advice and hoisted the parent view into a new subclass, and 
simply overrode drawRect:
- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    for (NSView *v in [self subviews]) {
        NSRect oldframe = [v frame];
        NSRect newFrame = NSMakeRect(
            oldframe.origin.x + oldframe.size.width + 26,
                                     oldframe.origin.y,
                                     oldframe.size.height,
                                     oldframe.size.height);
        
        [[NSColor redColor] set];
        NSRectFill(newFrame);
        [[NSColor blueColor] set];
        NSRectFill(oldframe);
    }
}
This behaves exactly as I expect - the labels/popupmenu are slightly framed in 
blue. (except NSTextField which apparently draws 100% of its own frame) and a 
red box is in the position where I want the alert icon to be. (and yes you are 
right, the 26/20 points-squares are appear obviously different and distracting! 
:) )


So in retrospect - I think it makes sense: I was adding the subviews quite 
early on - effectively within NSDocument's dataOfType:error  method. At this 
time my view is still the same size as it is in the NIB - and hasn't yet been 
stretched to fit in it's superview. Cocoa must change the frame positions when 
a subview is 'anchored' to the top of it's parent, the coordinates' origin is 
at the bottom, and the superview's size changes.

So I see I have two options:
a) draw the alert later (perhaps even in an override of drawRect;)
b) figure out how to programaticially set the edge of the superview to 'anchor' 
 the new image to. (like how you can graphically select in IB)

So I think I'm good for now, thanks for the tips that showed me the light!

-DavidM

On 25/11/2011, at 5:41 PM, Fritz Anderson wrote:

> On 25 Nov 2011, at 7:45 AM, David Mirabito wrote:
> 
>>   NSView *aview = theOffendingNSTextView;
> 
> Is this in fact an NSTextView, or do you mean NSTextField?
> 
>>   NSView *superView = [aview superview];
>> 
>>   NSRect oldframe = [aview frame];
>> 
>>   NSRect newFrame = NSMakeRect(
>>           oldframe.origin.x + oldframe.size.width + 26,
>>                                oldframe.origin.y,
>>                                oldframe.size.height,
>>                                oldframe.size.height);
> 
> So even if the view being annotated is 300 pt tall, and the icon image is 32 
> pt tall, you're going to make the icon view 300 x 300? And if the origin of 
> the annotated view is 24 pt (remember that's measured _from the bottom_, 
> you're going to align the annotation at the bottom of the annotated view? If 
> your text views are the only ones you've tried that are taller than the 
> others you've annotated, the annotation view will ride lower than you expect.
> 
> Also, many view frames differ in size and origin from the visually-apparent 
> frames. To diagnose, try subclassing your enclosing view (if you haven't 
> already), and in drawRect: iterate through the subviews and draw rectangles 
> around their frames. A very cursory skim of the class references don't show 
> me anything that would help you get the layout rects, but maybe you can hold 
> your nose and derive the layout rects from the frames empirically.
> 
> Maybe the 10.7 autolayout methods could help you; it may be good enough to 
> align your annotations with the annotated views' baselines.
> 
>>   NSImageView *img = [[NSImageView alloc] initWithFrame:newFrame];
>>   [img setImage:[NSImage imageNamed:@"NSInvalidDataFreestandingTemplate"]];
> 
> This isn't your problem, but never use literal strings for Cocoa's exported 
> global strings. You don't know whether the constant value is 
> @"com.apple.aStr", and the symbol they published to the API is 
> NSViewFrobbingA. 
> 
>>   [superView addSubview:img];
> 
>       — 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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

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

Reply via email to