2013-02-12 6 views
8

Hinweis: Dies ist für eine Cocoa App unter OS X, NICHT iOS.Core Animation: Setzen Sie anchorPoint auf 10.8, um eine Ebene um das Zentrum zu drehen

Ich habe eine Layer-Backed NSButton (Unterklasse von NSView). Was ich tun möchte, ist diese Schaltfläche mit Core Animation zu drehen. Ich verwende den folgenden Code, es zu tun:

CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
a.fromValue = [NSNumber numberWithFloat:0]; 
a.toValue = [NSNumber numberWithFloat:-M_PI*2]; 
[_refreshButton.layer setAnchorPoint:CGPointMake(0.5, 0.5)]; 
a.duration = 1.8; // seconds 
a.repeatCount = HUGE_VAL; 
[_refreshButton.layer addAnimation:a forKey:nil]; 

Dies funktioniert, außer dass, wenn es ausgeführt wird, die Schicht springt nach unten und nach links, so dass dessen Mittelpunkt am Ursprung Punkt des NSView, die ist die untere linke Ecke bei (0,0). Die Schicht dreht sich dann um ihr Zentrum, aber offensichtlich ist das Springen in die untere linke Ecke nicht akzeptabel.

Also, nach viel Lesen, ich diese Linie in den Release Notes 10.8 API gefunden:

On 10.8, AppKit will control the following properties on a CALayer 
(both when "layer-hosted" or "layer-backed"): geometryFlipped, bounds, 
frame (implied), position, anchorPoint, transform, shadow*, hidden, 
filters, and compositingFilter. Use the appropriate NSView cover methods 
to change these properties. 

Das bedeutet, dass AppKit mein Ruf "zu ignorieren" oben im Code -setAnchorPoint und stattdessen ist setze diesen Ankerpunkt auf den Ursprung der NSView (0,0).

Meine Frage ist: wie löse ich das? Was ist die "geeignete NSView-Cover-Methode", um den Ankerpunkt für den Layer festzulegen (ich finde eine solche Methode nicht in NSView). Am Ende des Tages möchte ich nur, dass sich mein Knopf auf unbestimmte Zeit um seinen Mittelpunkt dreht.

Antwort

15

Ich sehe keine Methoden auf NSView, die eine direkte "Abdeckung" für anchorPoint sind.

Was ich in the 10.8 release notes sehen Sie, außer dem, was Sie zitiert, ist dies:

Die anchor auch gesetzt ist immer sein (0,0), ...

Die anchorPoint Kontrollen, die Punkt des Layers ist position im Koordinatensystem des Superlayers. NSView setzt self.layer.anchorPoint auf (0,0), was bedeutet, dass die untere linke Ecke der Ebene self.layer.position ist.

Wenn Sie anchorPoint auf (0,5,0.5) setzen, bedeutet dies, dass die Mitte der Ebene auf der Ebene position der Ebene sein sollte. Da Sie position nicht geändert haben, hat dies den Effekt, dass Sie die Ebene nach unten und nach links verschieben, wie Sie sehen.

Sie benötigen die position Sie die Ebene wollen berechnen haben, wenn seine anchorPoint ist (0.5,0.5), wie folgt aus:

CGRect frame = _refreshButton.layer.frame; 
CGPoint center = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame)); 
_refreshButton.layer.position = center; 
_refreshButton.layer.anchorPoint = CGPointMake(0.5, 0.5); 
+0

Perfect! Wissen Sie; Ich habe die Position-Eigenschaft gesehen, aber ich habe es nicht versucht, weil ich den obigen Hinweis gelesen habe, der besagt, dass AppKit es kontrollieren wird. Danke für die Lösung! – Bryan

+0

Irgendeine Idee, warum die Rotation M_PI/2 das erste Mal gegen den Uhrzeigersinn und danach im Uhrzeigersinn drehen würde? – greg

+0

Ich müsste Ihren Code sehen. Sie sollten Ihre eigene Frage stellen. –

Verwandte Themen