2012-06-03 26 views
22

Chciałbym animować UIBezierPath z rect do trójkąta jeden, aby nie animować widok na ścieżce, ale animować samą ścieżkę, więc zmienia się z jednego kształtu na inny. ścieżka jest dodawana do CALayerJak animować UIBezierPath

CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.fillColor = [[UIColor whiteColor] CGColor];  
maskLayer.path = [self getRectPath]; 

-(CGPathRef)getTrianglePath 
{ 
    UIBezierPath* triangle = [UIBezierPath bezierPath]; 
    [triangle moveToPoint:CGPointZero]; 
    [triangle addLineToPoint:CGPointMake(width(self.view),0)]; 
    [triangle addLineToPoint:CGPointMake(0, height(self.view))]; 
    [triangle closePath]; 
    return [triangle CGPath]; 
} 

-(CGPathRef)getRectPath 
{ 
    UIBezierPath*rect = [UIBezierPath bezierPathWithRect:self.view.frame]; 
    return [rect CGPath]; 
} 

Odpowiedz

28

Nie jestem ekspertem od CoreAnimation ale można zdefiniować CABasicAnimation następująco

CABasicAnimation *morph = [CABasicAnimation animationWithKeyPath:@"path"]; 
morph.duration = 5; 
morph.toValue = (id) [self getTrianglePath]; 
[maskLayer addAnimation:morph forKey:nil]; 

Pierwsza linia wskazuje, że chcesz zdefiniować animację, która zmienia path właściwość warstwy. Drugi wiersz stwierdza, że ​​animacja trwa pięć sekund, a trzecia linia podaje ostateczny stan animacji. Na koniec dodajemy animację do warstwy. Klucz jest unikalnym identyfikatorem dla animacji, to znaczy, jeśli dodasz dwie animacje z tym samym kluczem, rozważa się tylko ostatnią. Ten klucz może również służyć do nadpisywania tak zwanych niejawnych animacji. Istnieje kilka właściwości domyślnej animacji, które są domyślnie animowane. Dokładniej, jeśli zmienisz jedną z tych właściwości, zmiana będzie animowana o czasie trwania 0,25.

+0

dzięki, proste. używałem CAKeyframeAnimation. –