On 07/07/2012, at 6:38 PM, Gideon King wrote:

> Has anybody successfully added a subview to an NSScroller?


Yes, but more recently I took it out again and moved that extra view elsewhere, 
because on Lion/Mountain Lion, these scroll areas are handled differently and 
the presence of an extra view is detected and used to revert the scroller to 
the "legacy" scrollbar design, which is going to look increasingly out of place 
as apps adopt the new one. This extra special-casing could also be affecting 
whether and how your view is drawn. That said my code worked on Lion, it just 
used the legacy scrollbars.

My subclass of NSScrollView only overrides one method - tile, and adds a 
property, 'placard' which is the extra view to insert. I believe this code 
originally was derived from someone else's example I found on the web in about 
2003, so I'm not trying to claim it as my own. It does work however.

- (void) setPlacard:(NSView *)inView
{
        [inView retain];
        if (nil != placard)
        {
                [placard removeFromSuperview];
                [placard release];
        }
        placard = inView;
        [self addSubview:placard];
}


- (void)tile
{
        [super tile];
        if (placard && [self hasHorizontalScroller])
        {
                NSScroller *horizScroller;
                NSRect horizScrollerFrame, placardFrame;

                horizScroller = [self horizontalScroller];
                horizScrollerFrame = [horizScroller frame];
                placardFrame = [placard frame];

                // Now we'll just adjust the horizontal scroller size and set 
the placard size and location.
                
                horizScrollerFrame.size.width -= placardFrame.size.width;
                [horizScroller setFrameSize:horizScrollerFrame.size];

                placardFrame.origin.x = NSMinX(horizScrollerFrame);
                        
                // Move horizontal scroller over to the right of the placard
                
                horizScrollerFrame.origin.x = NSMaxX(placardFrame);
                [horizScroller setFrameOrigin:horizScrollerFrame.origin];

                // Adjust height of placard
                placardFrame.size.height = horizScrollerFrame.size.height;// + 
1.0;
                placardFrame.origin.y = [self bounds].size.height - 
placardFrame.size.height;
                
                // Move the placard into place
                [placard setFrame:placardFrame];
        }
}



--Graham


_______________________________________________

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