2011-08-11 17 views
8

używam następujących do kodu, aby dodać drop shadow:Jak dynamicznie zmieniać cień podczas obrotu UIImageView?

letterE.layer.shadowColor = [[UIColor blackColor] CGColor]; 
letterE.layer.shadowOffset = CGSizeMake(2.5, 2.5); 
letterE.layer.shadowRadius = 3.0; 
letterE.layer.shadowOpacity = 0.95; 

i dodaje się obracać:

CABasicAnimation* rotationAnimation; 
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0]; 
rotationAnimation.duration = 5.0; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = 1.0; 
rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

[letterE.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 

Podczas animacji, cień jest statyczny, który wygląda dziwnie:

enter image description hereenter image description here

Jak mogę dynamicznie aktualizować cień podczas animacji?

Odpowiedz

13

Znalazłem to interesujące, więc dałem mu szansę. Możliwym rozwiązaniem jest zbudowanie drugiego przejrzystego widoku pod widokiem głównym, dając mu (widok od dołu) cień, korzystając ze ścieżki oryginalnego widoku. Następnie możesz zastosować animację do obu widoków. Zrobiłem to z prostymi widokami prostokątnymi, ale nie widzę powodu, dla którego nie można tego zrobić przy bardziej złożonych ścieżkach lub przy użyciu 2 CALayerów zamiast 2 UIViews.

ten sposób skonfigurować moje poglądy ...

testView = [[UIView alloc] initWithFrame:CGRectMake(40, 40, 100, 100)]; 
testView.backgroundColor = [UIColor redColor]; 

//increase y origin of second view to simulate shadow offset 
testViewShadow = [[UIView alloc] initWithFrame:CGRectMake(40, 50, 100, 100)]; 

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, NULL, CGRectMake(0, 0, testView.frame.size.width, testView.frame.size.height)); 
testViewShadow.layer.shadowPath = path; 
testViewShadow.layer.shadowOpacity = 1.0; 
testViewShadow.layer.shadowOffset = CGSizeMake(0, 0); 
testViewShadow.layer.shadowRadius = 10.0; 
CFRelease(path); 

[self.view addSubview:testViewShadow]; 
[self.view addSubview:testView]; 

..i moja animacja (wystarczy podłączyć swój CAAnimation do przycisku jako IBAction i stosowane zarówno widoki) ...

- (IBAction)rotate:(id)sender{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0]; 
    rotationAnimation.duration = 5.0; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = 1.0; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 

    [testView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
    [testViewShadow.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 

to właśnie wynik wygląda ...

enter image description hereenter image description here

Wszelkie transformacje (2D) powinny wyglądać wiarygodnie, jeśli zastosujesz je do obu widoków.

Nadzieję, że pomaga!

+0

Byłoby świetnie, gdybyś mógł to zaakceptować, gdyby pomógł. – mjisrawi

+0

+1, dobra odpowiedź. – occulus

Powiązane problemy