2013-02-12 12 views
8

UWAGA: Jest to aplikacja typu Cocoa na OS X, NIE iOS.Animacja rdzenia: ustaw anchorPoint na 10.8, aby obrócić warstwę wokół jej środka.

Mam NSButton z warstwą (podklasa NSView). To, co chcę zrobić, to obrócić ten przycisk za pomocą Core Animation. Używam następujący kod to zrobić:

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]; 

To działa, poza tym, że po uruchomieniu, warstwa skacze w dół iw lewo, tak, że jego punkt środkowy jest w miejscu pochodzenia, który NSView to lewy dolny róg na (0,0). Następnie warstwa obraca się wokół jej środka, ale oczywiście skok do dolnego lewego rogu nie jest akceptowalny.

Więc, po wielu czytania, znalazłem ten wiersz w 10,8 API informacjach o wydaniu:

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. 

oznacza to, że zestaw klas AppKit jest „ignorowanie” moje wezwanie do -setAnchorPoint w powyższym kodzie, a zamiast tego jest ustawienie punktu zakotwiczenia na pochodzenie NSView (0,0).

Moje pytanie brzmi: jak rozwiązać ten problem? Co to jest "odpowiednia metoda okładki NSView", aby ustawić anchorPoint dla warstwy (nie mogę znaleźć takiej metody na NSView). Pod koniec dnia, chcę tylko, aby mój przycisk obrócił się wokół punktu centralnego, w nieskończoność.

Odpowiedz

15

Nie widzę żadnych metod na NSView, które są bezpośrednią "okładką" dla anchorPoint.

Co ja widzę w the 10.8 release notes, oprócz tego, co cytowany, to:

Anchorpoint jest również zawsze ustawiona na (0,0), ...

W anchorPoint który steruje Punkt warstwy znajduje się pod position w układzie współrzędnych superlayera. NSView ustawia self.layer.anchorPoint na (0,0), co oznacza, że ​​dolny lewy róg warstwy wynosi self.layer.position.

Po ustawieniu anchorPoint na (0,5,0.5), oznacza to, że środek warstwy powinien znajdować się na poziomie warstwy position. Ponieważ nie zmodyfikowałeś position, powoduje to przesunięcie warstwy w dół i w lewo, jak widzisz.

Trzeba obliczyć position chcesz mieć warstwę gdy jego anchorPoint jest (0.5,0.5), podobnie jak to:

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! Wiesz; Widziałem właściwość position, ale jej nie wypróbowałem, ponieważ przeczytałem notatkę powyżej, która mówi, że AppKit zamierza to kontrolować. Dzięki za rozwiązanie! – Bryan

+0

Czy wiesz, dlaczego obrót M_PI/2 obróciłby się przeciwnie do ruchu wskazówek zegara za pierwszym razem i zgodnie z ruchem wskazówek zegara? – greg

+0

Będę musiał zobaczyć twój kod. Powinieneś zamieścić własne pytanie. –

Powiązane problemy