2013-12-07 115 views
0

我已經看到了高和低的解決方案,我已經無處。點擊動畫圖像/按鈕

我想開發一個非常簡單的點擊,動畫和播放聲音的iOS應用程序。

所以我會有一個說農場的地圖,當我點擊羊時,它會動畫併產生一些噪音。我已經設法實現了這一點,它的一切都很好。

我的問題和疑問是能夠點擊一個已經有動畫的按鈕。

所以,當視圖加載我想有云按鈕從左至右在天空中移動向右慢慢地,我又已經使用此代碼

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidLoad]; 


    [UIView animateWithDuration:8.5 
          delay:1.0 
         options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         cloudAnimate.center = CGPointMake(-100.0, 100.0); 
        } 
        completion:NULL]; 
} 

但是,當此按鈕從動畫實現了這個從左到右,它們不是可點擊的,所以我想旋轉雲朵並播放聲音的接觸不起作用。我已經閱讀了一些其他帖子,說這是做不到的,但我有我的iPhone和iPad的應用程序負載這樣做,所以任何人都知道如何實現這一點?

任何幫助將不勝感激,因爲我拉我的頭髮。

在此先感謝。

編輯:

行,所以拜答案的組合下面我幾乎得到這個工作

所以我用這個來設定初始CGPoint:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Move UIView 

    cloudAnimate.center = CGPointMake(400.0, 100.0); 
} 

爲了使雲從左到右呈現動態,我使用的是與原本稍微調整過的代碼相同的代碼:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidLoad]; 


    [UIView animateWithDuration:8.5 
          delay:1.0 
         options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat | UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         cloudAnimate.center = CGPointMake(100.0, 100.0); 
        } 
        completion:NULL]; 

} 

而且現在不是IBAction爲我使用這個:

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event { 

    CGPoint point = [[touches anyObject] locationInView:self.view]; 

    if([self.cloudAnimate.layer.presentationLayer hitTest:point]) { 

     SystemSoundID soundID; 
     NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Super_Mario_Bros_Mushroom" ofType:@"mp3"]; 

     AudioServicesCreateSystemSoundID((__bridge CFURLRef) [NSURL fileURLWithPath:soundFile], & soundID); 
     AudioServicesPlaySystemSound(soundID); 

     cloudAnimate.imageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"panda-png-chewing"],[UIImage imageNamed:@"panda-png-happy"],nil]; 

     cloudAnimate.imageView.animationDuration = 0.2; 
     cloudAnimate.imageView.animationRepeatCount = 6; 
     [cloudAnimate.imageView startAnimating]; 
    } 
} 

所以現在它幾乎正是我想要的,但如果你打的雲時,它是在其完成CGPoint(即使它會進行移動)應用程序崩潰。如果我在移動的時候碰到它,它會發出聲音和動畫。

任何人有任何建議,爲什麼這是?

+1

嘗試UIViewAnimationOptionAllowUserInteraction選項 –

+0

閱讀我對這個問題的回答(http://stackoverflow.com/questions/20367526/to-set-uianimation-and-touch-event-for-uiimageview/20367619#20367619),特別是編輯後的部分。 – rdelmar

回答

3

當您爲視圖設置動畫時,您將視圖設置爲其最終狀態。這樣,您只能在動畫的最終位置檢測觸摸。

但是,有可能解決這個問題。您需要捕捉觸摸事件並與presentationLayer進行比較。

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event { 

    CGPoint point = [[touches anyObject] locationInView:self.view]; 

    if([self.cloudAnimate.layer.presentationLayer hitTest:point]) { 

    //do something 
    } 
} 

表示層具有對的CALayer的視覺位置與您cloudAnimate相關的信息。

+0

嘿,這類作品,我已經將我的動畫添加到'//做某事'的空間,現在當雲移動時,我可以點擊它並播放聲音 - 真棒。但是當我點擊終點時,我得到一個'終止與NSException類型的未捕獲異常',並關閉應用程序。這顯然是我正在做的事情,但任何想法? –

+0

感謝您的凝膠蒂亞戈我發現問題,如果聲明工作,但我仍然有一個IBAction雲Animation_clicked分配到故事板中的按鈕。我刪除了它,它不再墜毀。再次感謝大家 - 讓它走向我想要的。 –

+0

我刪除了我的評論,重點關注什麼是重要的。我很高興你做到了:)。沒問題@DanDavies。當有人已經知道這些技巧時,這會更容易。隨時回到StackOverflow。 –

2

您也可以使用UIViewAnimationOptionAllowUserInteraction

+0

謝謝,但也沒有工作。這就是允許我在動畫停止後按下按鈕,不允許我在移動時點擊,所以不知道爲什麼。 –

+0

這是蒂亞戈工作答案的要求。 –

0

簡短的回答是,您不能在點擊動畫時點擊視圖。原因是視圖實際上並不是從開始到結束位置。相反,系統使用核心動畫中的「表示層」來創建視圖對象的外觀移動/旋轉/縮放/任何。

你需要做的是將一個輕拍手勢識別器附加到一個包含視圖的完全包圍動畫(可能是整個屏幕),然後編寫看着水龍頭座標的代碼,進行座標轉換,並決定是否點擊是在你關心的視圖上。如果水龍頭在一個按鈕上,並且您希望按鈕突出顯示,則您也需要處理該邏輯。

我已經在github上一個示例項目,顯示瞭如何做到這一點時,你正在做兩UIView的動畫和核心動畫與CABasicAnimation(其中動畫層,沒有意見。)

Core Animation demo with hit testing