Thanks Troy for the in-depth account. Yes, my goal is to customize the scroller's appearance, and yes, I wish this process involved less guess-work. As you say, there is no empty space when you let the scroller draw normally. You only see this when drawing a custom scroller based on the rects returned by -rectForPart:. That makes sense as those rects, as you say, are for hit-testing purposes only. Hence NSScrollerKnobSlot does not return the full rect for the slot, only the clickable part. I currently modify the rects returned by -rectForPart: for my drawings (eg. adjust the height and y position to cover the empty space), but I suppose calculating the parts based on the rect from the -drawRect: method would be even easier. My problem is I have a transparent table view and would prefer not to a have a slot for the knob at all, just a vertical scroller that goes all the way up to the edge of the table's header view, but it seems this is not possible. I can draw the knob in the designated slot cap area, but the drawing is messed up whenever the view is redisplayed. Oh well, the gap is only a few pixels, no big deal.
On Fri, Mar 28, 2008 at 5:44 PM, Troy Stephens <[EMAIL PROTECTED]> wrote: > As Hamish Allan pointed out, a scroller has logical "parts", but they > are not subviews. -rectForPart: returns the bounding rects that are > used for hit-testing those parts. In the olden days of OpenStep-style > Scrollers and their purely rectangular parts, these were exact and the > same rects used for drawing. On Mac OS X, they are only hit testing > bounding rects (since Scrollers now have curved parts), and do not > affect drawing of the Scroller, only hit-testing. > > So all that rectForPart:NSScrollerNoParts is telling you is that > there's a skinny rect at the top of the scroller that is not sensitive > to hit-testing. That makes sense, since there is a nonreactive end > cap on the scroll track that has no arrow (when Appearance prefs are > set for the scroll arrows to be shown "Together" at the other end). > This isn't an "empty" space when you let the scroller draw normally > though -- there's art there, or at least there should be. If you're > seeing otherwise, something else must be wrong. Can you clarify > whether you're seeing this when the scroller draws normally, or only > with your test drawing based on the -rectForPart: results in place? > > If your goal is to subclass NSScroller to customize its appearance, I > should add that the -drawParts and -drawArrow:highlight: methods are > obsolete and is no longer invoked by NSScroller's drawing code. Those > methods should be deprecated. There are some other difficulties with > customizing Scroller appearance using the existing API, and we have at > least one request to make that easier in the future. > > > > On Mar 27, 2008, at 6:17 PM, [EMAIL PROTECTED] wrote: > > Yes, I meant scroller, not slider. Just had a glass of wine too > > much :-) > > > > Actually I don't want to add an accessory view, I want to get rid of > > the one that appears to be there by default. I have attached a > > screenshot showing what I'm talking about. The yellow part is the > > knob, drawn by filling the rect return by calling [self > > rectForPart:NSScrollerKnob]. The green part is the slot, [self > > rectForPart:NSScrollerKnobSlot]. The white part above the slot is by > > default black, but here I made it white by filling the rect returned > > by calling [self rectForPart:NSScrollerNoParts]. > > > > I can move the knob/slot upwards by tampering with their designated > > rects ("rect.origin.y -= 5"), thus hiding the white part. But that > > messes up the drawing when the view is updated. > > > > I figured the white part was a view, but since you are telling me > > NSScroller has no subviews I really don't know what to think. Maybe > > there is something wrong with my implementation? > > > > @implementation TestScroller > > > > - (void)drawRect:(NSRect)rect > > { > > [self drawKnobSlot]; > > [self drawKnob]; > > } > > > > - (void)drawKnob > > { > > NSRect rect = [self rectForPart:NSScrollerKnob]; > > [[NSColor yellowColor] set]; > > [NSBezierPath fillRect:rect]; > > } > > > > - (void)drawKnobSlot > > { > > NSRect rect = [self rectForPart:NSScrollerKnobSlot]; > > [[NSColor greenColor] set]; > > [NSBezierPath fillRect:rect]; > > } > > > > @end > > > > On Fri, Mar 28, 2008 at 12:41 AM, Troy Stephens > > <[EMAIL PROTECTED]> wrote: > >> > >> On Mar 27, 2008, at 4:26 PM, [EMAIL PROTECTED] wrote: > >>> Thanks, but the corner view is the right side corner of the header > >>> view, right? I was talking about the small view just below it, on > >>> top > >>> of the vertical slider and part of the slider itself. It's a tiny > >>> view > >>> of about 2 pixels height. I believe it corresponds to > >>> NSScrollerNoPart, but I'm not sure. > >> > >> (By "slider" I take it you really mean "scroller", as NSSlider is > >> something else entirely. :-) > >> > >> An NSScroller (currently) has no subviews, but if your aim is to add > >> one or more accessory views above the scroller, that can be done by > >> subclassing NSScrollView. The key is to override NSScrollView's - > >> tile > >> method to invoke [super tile], and then adjust the layout to > >> accommodate your accessory subview(s). Figure out where you want > >> your > >> accessory subview(s) to go, set their frame(s), and change the > >> ScrollView's verticalScroller's frame (shrink and move down, since > >> ScrollViews are flipped) to make room for them. > >> > >> > >> > >>> > >>> > >>> On Thu, Mar 27, 2008 at 9:53 PM, Troy Stephens <[EMAIL PROTECTED]> > >>> wrote: > >>>> > >>>> On Mar 27, 2008, at 9:50 AM, [EMAIL PROTECTED] wrote: > >>>>> Hi, > >>>>> > >>>>> NSScroller has a small view, by default two pixels high, just > >>>>> above > >>>>> the scroller and below the NSTableHeaderView's corner view. How > >>>>> can I > >>>>> get at this view? If you look at the XCode interface you can see > >>>>> they > >>>>> have put an icon in this view (the one that splits the editor > >>>>> view) > >>>>> and made it larger. I would like to remove the view completely so > >>>>> the > >>>>> scroller goes all the way up to the edge of the corner view. > >>>>> > >>>>> This question has been addressed before in the archives, but > >>>>> unfortunately the link pointing to an answer is no longer valid. > >>>>> > >>>>> Thanks. > >>>>> F. > >>>> > >>>> See NSTableView.h: > >>>> > >>>> /* Get and set the cornerView. The cornerView is the view that > >>>> appears > >>>> directly to the right of the headerView above the vertical > >>>> NSScroller. > >>>> The scroller must be present for the cornerView to be shown. > >>>> Calling - > >>>> setCornerView: may have the side effect of tiling the > >>>> enclosingScrollView to accomodate the size change. The default > >>>> value > >>>> is an internal class that properly fills in the corner. > >>>> */ > >>>> - (void)setCornerView:(NSView *)cornerView; > >>>> - (NSView *)cornerView; > >>>> > >>>> -- > >>>> Troy Stephens > >>>> Cocoa Frameworks > >>>> Apple, Inc. > >>>> > >>>> > >>>> > >>>> > >> > >> > >> -- > >> Troy Stephens > >> Cocoa Frameworks > >> Apple, Inc. > >> > >> > >> > >> > > <Picture 2.png> > > > > > -- > Troy Stephens > Cocoa Frameworks > Apple, Inc. > > > > _______________________________________________ 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 [EMAIL PROTECTED]