2013-07-27 30 views
0

這可能聽起來確實是小白,但我花了整整一天的時間來解決這個問題,並希望得到一些幫助。Objective-C中調用方法中的「自我」的替代方案

你看我有一種方法,我在遊戲中多次打電話。如果我使用[self myMethod];,那麼它可以工作一次。然後當我再次調用它時,方法中的動畫不再開始了。

我需要的是用可以「分配」和「釋放」的選擇替換「自我」,以使我的動畫起作用。

我試過了;

@implementation gameViewController 


gameViewController *object = [[gameViewController alloc] init]; 

[object myMethod]; 

但是,上述自我替代甚至沒有調用該方法。我不知道我做錯了什麼,它應該像「自我」一樣工作。

有什麼我錯過了?你如何讓班級的對象像「自我」一樣工作?

非常感謝。

下面是我的代碼更詳細的外觀;

[self explosionAnimations];

- (void) explosionAnimations 
{ 


     UIImage *image = [UIImage imageNamed: @"Yellow Explosion.png"]; 

     [bomb setImage:image]; 

     [UIView beginAnimations:@"bomb1ExplosionIncrease" context:NULL]; 

     [UIView setAnimationDuration:0.5]; 

     [UIView setAnimationDelegate:self]; 

     bomb.transform = CGAffineTransformMakeScale(3.4, 3.4); 

     [UIView commitAnimations]; 

} 

setImage每次都能正常工作。但是動畫停止了該方法的第二次調用。在控制檯中,它會記錄「動畫已完成」,而圖像沒有任何事情發生。

這使我相信,不知何故「自我」認爲動畫已經完成,不會再費心去做。所以我認爲一個新的「alloc」可能讓它覺醒。

+3

最有可能你正在接近這個錯誤的方式。你可能只需要重新設置一些東西,這樣調用方法(用自己或其他方式)就可以第二次運行。 – Nick

+0

@尼克或者可能相反。也許在調用'[self myMethod]'的時候,一些額外的設置代碼被調用,這在OP的代碼示例中沒有調用。就像被添加到視圖或其他東西一樣,如果控制器沒有顯示在任何地方,顯然動畫將不會顯示。 (我不是很熟悉ObjC或OP在這裏試圖做什麼,所以我不確定是否有必要實例化一個控制器,然後不將它連接到某個東西。也許解決方案不是創建一個新的,但得到現有的一個處理。) – millimoose

+0

@Chester如果你正嘗試在同一個控制器上運行一個動畫,那麼當你使用self時,你不應該試圖在同一個對象上調用myMethod而不是創建一個新的控制器嗎? – millimoose

回答

5

該問題與「自我」無關。問題是你在你的動畫中設置了變換,然後當你再次運行時,你正在設置相同的變換,所以它什麼也不做。您需要將框架重置爲新框架,然後在再次執行動畫之前將轉換設置回標識轉換。此外,你應該使用基於塊的動畫。我不確定這是做到這一點的最佳方式,但這對我有用(如果您關閉了自動佈局)。

- (void)explosionAnimations { 

    UIImage *image = [UIImage imageNamed: @"Yellow Explosion.png"]; 
    [self.bomb setImage:image]; 

    [UIView animateWithDuration:.5 animations:^{ 
     self.bomb.transform = CGAffineTransformMakeScale(3.4, 3.4); 
    } completion:^(BOOL finished) { 
     CGRect newFrame = self.bomb.frame; 
     self.bomb.transform = CGAffineTransformIdentity; 
     self.bomb.frame = newFrame; 
    }]; 
} 

如果你在汽車佈局中的應用做這開啓(這是默認設置),那麼我不會用一個變換,只是通過調整調整圖像視圖的寬度和高度其高度和寬度的限制。因此,在這種方法中,你應該IBOutlets高度和你在IB使寬度限制,然後更改動畫塊的常數值:

[UIView animateWithDuration:.5 animations:^{ 
     self.heightCon.constant = self.heightCon.constant * 3.4; 
     self.widthCon.constant = self.widthCon.constant * 3.4; 
     [self.view layoutIfNeeded]; 
    }]; 
+0

+1正確地做到了這一點,所以'beginAnimations' /'commitAnimations'已經被阻止,以支持基於塊的動畫方法 – Abizern

+0

謝謝你非常感謝你的幫助rdelmar!我正要回應說我也解決了這個問題。在吃午餐時,我深深地想到拿出一個答案。在我的情況下,我做了一個「雛菊鏈」動畫,在3.4變換之後,我將它重新轉換爲1.0。但是當我遇到我的代碼更麻煩的時候,我會研究你的代碼並加入。非常感謝。你的解決方案比我的更專業,但我必須更多地研究塊動畫。我只知道動畫的基礎知識。 –