2012-06-12 197 views
0

我想要做的是在計時器滴答時動畫標籤。 我有一個基於窗口的應用程序。核心動畫和NSTimer

  1. 我在while循環中嘗試了核心動畫,但程序只是凍結。
  2. 我嘗試了由定時器(NSTimer)觸發的核心動畫,但沒有任何反應。

問題:我調試過的程序,一切都很好,所有的語句都在執行,但沒有任何反應。我認爲不允許在循環中或定時器觸發的核心動畫。有沒有其他方法?

我有的是:

drawingTimer = [NSTimer scheduledTimeWithTimeInterval:60.0 target:self 
       selector:@selector(slideWords) userInfo:nil repeats:NO]; 

-void (slideWords){ 
randomNumber = 1 + arc4Random()%2; 

if(randomNumber = 1){ 
    Redlabel.alpha = 1.0; 
    RedLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 animations:^{ 
     Redlabel.alpha = 1.0; 
     Redlabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      Redlabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

if(randomNumber = 2){ 
    GreenLabel.alpha = 1.0; 
    GreenLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 animations:^{ 
     GreenLabel.alpha = 1.0; 
     GreenLabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      GreenLabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

}

+0

沒有讀完整個事情,但你的條件只是做作業。兩者都將被評估爲true,並改變randomNumber。另外,alpha級別被賦值爲1,然後被賦值爲1(no-op)。 – danh

+0

當我只寫在RedLabel.alpha .....休息的行;程序工作正常。問題應該由NSTimer或循環觸發,所以我正在尋找替代品。 –

+0

此外,您將兩個標籤的框架設置爲相同的矩形,然後對同一矩形設置動畫。一個將永遠隱藏。我認爲你應該重新開始並從根本上簡化:沒有循環或計時器,沒有隨機的。只需讓一個標籤消失並移動你想要的方式(可能會添加一個臨時按鈕來觸發它)。然後做第二個標籤。然後硬編碼你想要的兩個隨機情況,然後添加隨機...等等。你會到達那裏! – danh

回答

1

由於DANH在他的評論中說,無論你的if語句應該是

if (randomNumber == value) 

一個等於是不是一個比較操作,這是一個賦值操作符。編譯器應該給你一個警告。

其次,animateWithDuration是UIView方法,而不是UIWindow方法。我猜編譯器允許你編寫的東西,因爲UIWindow繼承自UIView,但是發送一個類消息給一個沒有實現該方法的子類是一個壞主意。

動畫的方法應該讀

[UIView animateWithDuration: x... 

三,核心動畫與定時器觸發應該只是罰款。但是,由於您的計時器不重複,爲什麼要使用計時器呢?使用延遲的動畫方法形式,並使代碼更清晰。那麼你根本不需要計時器或單獨的「slideWords」方法。你的代碼可能是這樣的:

randomNumber = 1 + arc4Random()%2; 

if(randomNumber = 1){ 
    Redlabel.alpha = 1.0; 
    RedLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 
     delay: 60.0 
     options: 0 
     animations:^{ 
     Redlabel.alpha = 1.0; 
     Redlabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      Redlabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

if(randomNumber = 2){ 
    GreenLabel.alpha = 1.0; 
    GreenLabel.frame = CGRectMake(0, -50, 320, 100); 
    [UIWindow animateWithDuration:5.0 
     delay: 60.0 
     options: 0 
     animations:^{ 
     GreenLabel.alpha = 1.0; 
     GreenLabel.frame = CGRectMake(0,300,320,100); 
    }completion:^(BOOL finished){ 
     [UIWindow animateWithDuration:0.5 delay:0.5 options:0 animations:^{ 
      GreenLabel.alpha = 0.0; 
     }completion:^(BOOL finished){ 
     }]; 
    }]; 
} 

第四:在Cocoa中有一個強大的命名約定,你應該遵循。方法名稱和變量名稱應以小寫字母開頭,名稱中的每個單詞都應該大寫。只有類名應該大寫。 (蘋果的核心基礎功能遵循不同的命名規則,但那些不是方法,它們是C函數...)

所以你的「RedLabel」應該是「redLabel」和「GreenLabel」應該是「greenLabel」

+0

這一次,UIView有問題。 [window setHidden:YES]; [newGameView setHidden:NO]; 我得到的只是一個空白的屏幕。我知道我缺乏客觀的編碼c。不管怎樣,謝謝你。 –

+0

我不認爲你應該設置窗口隱藏:是的。這會隱藏一切,並給你一個黑屏。在iOS上,一個窗口負責整個屏幕,並託管當前視圖控制器的內容視圖。 –