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]

Reply via email to