2013-02-28 117 views
0

我有一個動畫,由於某種原因不動畫。iOS的圖像startAnimating不是動畫(大部分時間)

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationController.navigationBar.hidden = YES; 
    self.nameLabel.text = [self.name uppercaseString]; 
    self.gradient1.alpha = .9; 
    self.gradient1.image = [UIImage imageNamed:@"heart.png"]; 
    self.gradient1.animationImages = [[NSArray alloc] initWithObjects: 
             [UIImage imageNamed:@"gradiant1.png"], 
             [UIImage imageNamed:@"gradiant2.png"], 
             ... 
             [UIImage imageNamed:@"gradiant26.png"], nil]; 
    self.gradient1.animationDuration = .5; 
    self.gradient1.animationRepeatCount = 1; 

    [self updateStats:nil]; 

} 

-(void)updateStats:(NSTimer*)timer{ 
Utilities *utility = [[Utilities alloc] init]; 
[utility getDataWithSSID:self.ssID completion:^(bool *finished, NSArray *objects) { 
    if (finished){ 
     ... 
     [self.gradient1 startAnimating]; 
    } 
    self.twoSecTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self 
                 selector:@selector(updateStats:) 
                 userInfo:nil 
                 repeats:NO]; 

}]; 

}

有時動畫一次或兩次,那麼即使定時器繼續打一遍又一遍停止。其他時候它根本不生動。然而,我有一些佔位符按鈕,我把它放在故事板上,它們與任何東西都沒有關係,只要按下其中一個按鈕,它就會在下一次定時器命中時產生動畫效果(實際上,即使我沒有按下屏幕有任何形式的手勢識別器..)。另外,當我在這個ViewController中添加所有其他垃圾時,它會每隔一段時間調用一次它的動畫。所以我認爲這是比我忘記的更深的東西,所以設置一些財產。

+0

看起來好像你在遞歸調用updateStats :.遞歸調用影響UI的方法時,我看到了UI鎖定。在updateStats中放置一個斷點:進行驗證。 – groomsy 2013-02-28 23:12:16

+0

它做得很好,沒有鎖定。我必須這樣做,因爲遞歸調用實際上是在另一個函數調用的完成塊內。 – 2013-02-28 23:16:21

回答

1

將動畫觸發器移動到該視圖實際上可見的時刻可能是一個比較好的主意 - 因此可以是viewDidAppear:

此外,您的創建遞歸計時器調度的方式讓我發抖。我想它適用於您,但我肯定會建議使用repeats標誌設置爲YES來代替。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationController.navigationBar.hidden = YES; 
    self.nameLabel.text = [self.name uppercaseString]; 
    self.gradient1.alpha = .9; 
    self.gradient1.image = [UIImage imageNamed:@"heart.png"]; 
    self.gradient1.animationImages = [[NSArray alloc] initWithObjects: 
             [UIImage imageNamed:@"gradiant1.png"], 
             [UIImage imageNamed:@"gradiant2.png"], 
             ... 
             [UIImage imageNamed:@"gradiant26.png"], nil]; 
    self.gradient1.animationDuration = .5; 
    self.gradient1.animationRepeatCount = 1; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    //animate right away... 
    [self updateStats:nil]; 
    //trigger new animations every two seconds 
    self.twoSecTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self 
                 selector:@selector(updateStats:) 
                 userInfo:nil 
                 repeats:YES]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    [self stopUpdatingStats]; 
} 

-(void)stopUpdatingStats 
{ 
    [self.twoSecTimer invalidate]; 
} 

-(void)updateStats:(NSTimer*)timer 
{ 
    NSLog(@"updating"); 
    [self.gradient1 startAnimating]; 
}