Hello.

The basic problem boils down to -hitTest: returning a completely
incorrect layer when the layer-backed NSView with the root layer is
inside a scroll view.

I've provided some sample code to demonstrate this problem. To see it
in action, just put the code into an NSView class, and stick an NSView
in your NIB with the custom class name, and embed this in an
NSScrollView.

Specifically, you'll notice that the -hitTest: returns the correct
layer *only* if you click the view while it is fully visible in the
window, and before you have made it not-fully-visible for the first
time. After you resize the scroll view to hide any portion of this
NSView subclass, -hitTest: will consistently return the wrong layer
every time.

- (void) awakeFromNib {
        [self setFrameSize:NSMakeSize(300, 300)];
        
        [[self enclosingScrollView] setWantsLayer:YES];
        
        int i;
        for (i = 0; i < 6; i++) {
                CALayer *layer = [CALayer layer];
                layer.frame = CGRectMake(0, i * 50, 300, 50);
                
                float r = (float)(random() % 100) / 100.0;
                float g = (float)(random() % 100) / 100.0;
                float b = (float)(random() % 100) / 100.0;
                
                CGColorRef color = CGColorCreateGenericRGB(r,g,b,1.0);
                layer.backgroundColor = color;
                CGColorRelease(color);
                
                layer.name = [NSString stringWithFormat:@"%d", i];
                
                [self.layer addSublayer:layer];
        }
}

- (void) drawRect:(NSRect)rect {
        [[[NSColor greenColor] colorWithAlphaComponent:0.5]
drawSwatchInRect:[self bounds]];
}

- (void) mouseDown:(NSEvent*)event {
        NSPoint point = [self convertPoint:[event locationInWindow] 
fromView:nil];
        CALayer *layer = [self.layer hitTest:NSPointToCGPoint(point)];
        NSLog(@"%@", [layer name]);
}

I've tried to replace `self` with the enclosing scroll view, or its
content view or document view, in the -mouseDown: method, and many
combinations of this. Nothing seems to do the trick. I've also not
seen anybody have this same problem on cocoa-dev, google, et al.

Thanks in advance for any help!

-Steven Degutis
_______________________________________________

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