2010-08-04 21 views
6

Şu anda UIView animasyonlarını test ediyorum ve CALayer tarafından oluşturulan gölgelerin ([view.layer setShadowStuffHere] kullanarak) animasyonun başlangıcında kaybolduğunu ve animasyonun sonunda yeniden ortaya çıktığını fark ettim. Bu gölgeleri koruyabilmem ve gölgelerin UIView ile birlikte canlandırmanın bir yolu var mı? Kenar boşlukları olmadan gölgeleri kullanmayı denedim, ancak bu, korkunç bir fikirdi, çünkü kare hızı animasyon sırasında bir kaya gibi düştü ve ben zaten gölgeleri alamadım.CALayer Gölgeler UIView animasyonu sırasında kaybolan

Şu anda kullanıyorum kod aşağıda. Başlangıçta kırmızı bir görünüm görürsünüz ve dokunduğunuzda daha büyük bir mavi görünüme dönersiniz. Sonuç, iPad müzik uygulamasına benzer bir şey olmalı; Bir albüm seçildiğinde, arka taraftaki bir görünümü ortaya çıkarmak için ters çevrilir.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITapGestureRecognizer * tapRec; 

    // Drop shadow Path creation 
    CGFloat x1 = 0; 
    CGFloat y1 = 0; 
    CGFloat x2 = 100; 
    CGFloat y2 = 100; 

    frontBorderPath = CGPathCreateMutable(); 
    CGPathMoveToPoint(frontBorderPath, NULL, x1, y1); 
    CGPathAddLineToPoint(frontBorderPath, NULL, x2, y1); 
    CGPathAddLineToPoint(frontBorderPath, NULL, x2, y2); 
    CGPathAddLineToPoint(frontBorderPath, NULL, x1, y2); 
    CGPathAddLineToPoint(frontBorderPath, NULL, x1, y1); 

    x2 = 400; 
    y2 = 400; 
    backBorderPath = CGPathCreateMutable(); 
    CGPathMoveToPoint(backBorderPath, NULL, x1, y1); 
    CGPathAddLineToPoint(backBorderPath, NULL, x2, y1); 
    CGPathAddLineToPoint(backBorderPath, NULL, x2, y2); 
    CGPathAddLineToPoint(backBorderPath, NULL, x1, y2); 
    CGPathAddLineToPoint(backBorderPath, NULL, x1, y1); 

    containerView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
    containerView.clipsToBounds = NO; 
    [containerView.layer setShadowPath:frontBorderPath]; 
    [containerView.layer setShadowOpacity:1]; 
    [containerView.layer setShadowOffset:CGSizeMake(0,0)]; 
    [containerView.layer setShadowRadius:3]; 
    [containerView.layer setShouldRasterize:NO]; 
    [self.view addSubview:containerView]; 

    tapRec = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(frontTap)] autorelease]; 
    frontView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    frontView.backgroundColor = [UIColor redColor]; 
    [frontView addGestureRecognizer:tapRec]; 
    [containerView addSubview:frontView]; 

    tapRec = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backTap)] autorelease]; 
    backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 400, 400)]; 
    backView.backgroundColor = [UIColor blueColor]; 
    [backView addGestureRecognizer:tapRec];  
} 

- (void)frontTap{ 
    NSLog(@"fronttap"); 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.7]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:containerView cache:YES]; 

    [frontView removeFromSuperview]; 
    [containerView addSubview:backView]; 
    containerView.frame = CGRectMake(100, 100, 400, 400); 
    [containerView.layer setShadowPath:backBorderPath]; 

    [UIView commitAnimations]; 

} 

- (void)backTap{ 
    NSLog(@"backtap"); 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.7]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES]; 

    [backView removeFromSuperview]; 
    [containerView addSubview:frontView]; 
    containerView.frame = CGRectMake(100, 100, 100, 100); 
    [containerView.layer setShadowPath:frontBorderPath]; 

    [UIView commitAnimations]; 

} 

cevap

12

Size UIView animasyon yapıyoruz ne zaman gölgeler hep görünür olmasını istiyorsanız eğer öyleyse, o (en azından çevirme tipi animasyonlar için) her durumda sizin görünümün clipsToBounds mülk ve klipleri bunu görmezden çıkıyor Her şeyi içeren yeterince büyük bir görünüm çerçevesine sahip olmanız gerekir.

+0

Biraz detaylandırır mısınız? – sole007

+0

@ sole007: Bu özel cevap, muhtemelen bugün için geçerli olmak için çok eskidir (ve bu konuyla ilgili herhangi bir yakın zamana rastlamadım), ancak kapalı bir ihtimalde, kliplerToBounds ayarlanmış olsa bile false, ve gölgeleri bir görünümün belirli sınırlarının dışına çıkarmak için CALayers'ı kullandınız, bu gölgeler için gösterilmeyecek clipToBounds'lara güvenmek, farketmez ve bu gölgeler ortaya çıkmaz. Çözüm daha sonra gölgelerin sınırların dışında kalmasından ziyade gölgeleri içerecek şekilde görünüyor. –