Re: NSScroller question
Re: NSScroller question
- Subject: Re: NSScroller question
- From: Steve Weller <email@hidden>
- Date: Sat, 29 Mar 2008 08:39:15 -0700
Try looking at the source for TextEdit. TextEdit adds a pop-up at the
end of the horizontal scroller by overriding NSScrollView's tile:
method. You may be able to change the layout so that the end of the
NSScroller is clipped off.
On Mar 29, 2008, at 4:57 AM, email@hidden wrote:
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@hidden>
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@hidden 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@hidden> wrote:
On Mar 27, 2008, at 4:26 PM, email@hidden 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@hidden
>
wrote:
On Mar 27, 2008, at 9:50 AM, email@hidden 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 (email@hidden)
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:
This email sent to email@hidden
--
Blog: http://www.bagelturf.com/ Photos: http://bagelturf.smugmug.com/
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden