Ok, das ist, was ich zusammen genäht. Der Kontext ist, dass ich eine benutzerdefinierte Ansicht mit einem Sublayer (CATextLayer) habe, den ich mit dem eingebauten Layout-Manager einschränke. Hier ist die awakeFromNib in CustomView.m
- (void) awakeFromNib {
CALayer *layer = [CALayer layer];
layer.backgroundColor = [CGColorHolder black];
layer.layoutManager = [CAConstraintLayoutManager layoutManager];
[self setLayer:layer];
[self setWantsLayer:YES];
CATextLayer *textLayer = [CATextLayer layer];
textLayer.string = @"TextLater";
textLayer.name = @"textLayer";
textLayer.fontSize = 42.0f;
textLayer.alignmentMode = kCAAlignmentCenter;
[textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX relativeTo:@"superlayer" attribute:kCAConstraintMidX offset:0.0f]];
[textLayer addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY offset:-50.0f]];
}
Dann über reite ich die mouseDown- Methode für die benutzerdefinierte Ansicht. Mit -hitTest gebe ich die Ebene zurück, die den Punkt enthält, an dem die Maustaste gedrückt wurde, und setze dann ein Attribut der Ebene, um anzuzeigen, dass es getroffen wurde.
- (void)mouseDown:(NSEvent *)theEvent {
CALayer *layer = [self.layer hitTest:NSPointToCGPoint([theEvent locationInWindow])];
layer.backgroundColor = [CGColorHolder red];
}
Auch, müssen Sie das Fenster enthält, stellen Sie sicher, mousemoved Ereignisse akzeptieren:
[window acceptsMouseMovedEvents];
Ich weiß nicht, wie weit mich das in Bezug auf eine wirklich anspruchsvolle nehmen Benutzeroberfläche. Von hier aus werde ich wahrscheinlich delegieren, was mit dem zurückgegebenen Layer zu tun ist, basierend auf dem zurückgegebenen Namen. Aber das könnte sehr schnell hässlich werden. Obwohl ich meine eigene Frage hier beantwortet habe, würde ich wirklich gerne etwas von jemandem bekommen, der wirklich weiß, was er tut! : D Danke!