2010-11-18 14 views
1

Ich habe eine Coverflow-like Bilderkarussell Fotos w/iPhoto scripting Brücke greifen. Ich habe die Ansicht Satz Ersthelfer zu akzeptieren und haben für Links- und Rechtspfeile implementierten Methoden, kann aber nicht herausfinden, konzeptionell, wie die Schichten klickbare nähern machen. Ich weiß, dass das Akzeptieren von Mouse-Down-Ereignissen die Aufgabe der enthaltenden Ansicht ist, aber ich kann die Teile nicht in meinem Kopf zusammensetzen.klickbare CALayer UIs

Der allgemeine Punkt ist, sollte ich auch CALayers in UI-Objekte wie Schaltflächen usw. zu machen versuchen? Weil sie auf andere Arten sehr flexibel sind und ich liebe, mit ihnen zu arbeiten.

Danke!

Antwort

3

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!