2010-01-25 53 views
19

我想淡入UIView作爲我的主視圖的子視圖。我嘗試淡入的UIView的尺寸爲320x55。試圖淡入UIView沒有成功

我設置了視圖和一個計時器;

secondView.frame = CGRectMake(0, 361, 320, 55); 
secondView.alpha = 0.0; 
[self.view addSubview:secondView]; 
[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(fadeView) userInfo:NO repeats:NO]; 

定時器觸發以下代碼;

secondView.alpha = 1.0; 
CABasicAnimation *fadeInAnimation; 
fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
fadeInAnimation.duration = 1.5; 
fadeInAnimation.fromValue = [NSNumber numberWithFloat:0.0]; 
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0]; 
[fadeInAnimation setDelegate:self]; 
[secondView.layer addAnimation:fadeInAnimation forKey:@"animateOpacity"]; 

我的secondView在Interface Builder中連接並響應其他消息,但我無法看到屏幕上發生的任何事情。

任何人都可以請幫我弄清楚這裏發生了什麼?

謝謝, 裏基。


在回答以下建議:

我有點不確定在這裏。起初,我把這個代碼(因爲我看到secondView作爲UIView的實例?):

[secondView beginAnimations:nil context:NULL]; 
[secondView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[secondView commitAnimations]; 

然後我想你的建議,其沒有產生警告或錯誤,但它仍然沒有帶來任何的表面:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 

謝謝!瑞奇。


回答

43

你應該能夠做到這一點簡單一點。你有沒有嘗試過這樣的事情?

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.5]; 
[secondView setAlpha:1.0]; 
[UIView commitAnimations]; 
+0

該代碼產生3個警告,所有的說UIView可能不會對消息作出響應。它也會崩潰應用程序。爲什麼是這樣? – Ricky 2010-01-25 11:57:58

+0

@瑞奇:很奇怪。你在使用iPhone SDK嗎? – kennytm 2010-01-25 12:10:22

+0

你能發佈周圍的代碼嗎?當我這樣做時編譯就好了。 – kubi 2010-01-25 12:10:42

11

這不會回答你的問題,如果你堅持要用CoreAnimations,但對的iPhoneOS,它更容易使用動畫塊UIView的動畫。

secondView.alpha = 0.0f; 
[UIView beginAnimations:@"fadeInSecondView" context:NULL]; 
[UIView setAnimationDuration:1.5]; 
secondView.alpha = 1.0f; 
[UIView commitAnimations]; 

此外,您還可以調用延遲時間的委託與

[self performSelector:@selector(fadeView) withObject:nil afterDelay:0.5]; 
+2

你也可以通過調用UIView setAnimationDelay來擺脫整個計時器。例如[UIView setAnimationDelay:0.5] – 2010-01-25 11:46:43

16

在我看來,你錯過的一件事就是你的視圖可能已經有了1.0的alpha值。在動畫調用之前確保alpha是0(或任何你想要的)。

我更喜歡使用塊動畫。它更乾淨,更獨立。

secondView.alpha = 0.0f; 
[UIView animateWithDuration:1.5 animations:^() { 
    secondView.alpha = 1.0f; 
}]; 
+1

具體關於動畫自己的線程,它是主線程。動畫更改按時間間隔(動畫持續時間)分派。還有一個方面,總是記得從主線程調用「UIView animateWithDur ...」方法。因此,如果此調用是由主線程以外的線程構成的,請使用dispatch_asynch(dispatch_get_main_queue(),^ {[UIView animateWithDur ...]})包裝它。 – 2012-10-13 12:28:16

+0

+1您的視圖可能已經有1.0的alpha。在這種情況下,「動畫」從1.0到1.0,動畫立即結束,而不是在指定的持續時間之後結束。確保實際上有一個更改爲動畫。 – pkamb 2014-08-26 14:07:34

+0

@GökhanBarışAker正確的關於線程的觀點。我的大部分街區都在他們自己的線上,我說話太快了。我更新了這篇文章。感謝您指出了這一點。 – steveb 2014-09-04 15:44:45

8

這裏也是一個很好的選擇與許多選擇和易於使用。

[secondViewController.view setAlpha:0.0]; 
    [UIView animateWithDuration:1.5 
      delay:0.0 
      options:UIViewAnimationOptionCurveEaseIn // See other options 
      animations:^{ 
      [secondViewController.view setAlpha:1.0]; 
     } 
     completion:^(BOOL finished) { 
     // Completion Block 
     }];