2015-07-19 69 views
1

我有一個UIButton子類,它執行一些自定義繪圖和動畫。這一切都工作正常和丹迪。UIButton子類:在自定義動畫完成後調用[super touchesEnded:]

但是,我的大多數按鈕通過調用[self dismissViewControllerAnimated]忽略當前視圖,一旦確認模型無論按鈕按下是否應該完成,我都希望有一個延遲在解散視圖之前允許動畫完成。

我能夠很容易地在touchesEnded上爲UIButton子類創建動畫,然後調用[super touchesEnded],它可以正常工作,但它不會讓我的動畫在關閉視圖之前完成。就像這樣:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CABasicAnimation *myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.foo"]; 
    //set up myAnimation's properties 

    [self.layer addAnimation:shakeAnimation forKey:nil]; 
    [super touchesEnded:touches withEvent:event]; //works! but no delay 
} 

我爲了創建延遲第一次嘗試通過使用CATransaction如下:

其中,據我所知,在執行CATransaction的completionBlock,但它只是ISN什麼都不做。

我也試着將touchesEnded中的touches和event參數賦值給屬性和全局變量,然後在由NSTimer調用的另一個方法中執行[super touchesEnded]。同樣的事情似乎發生在代碼執行的地方,但是我對[super touchesEnded]的調用沒有做任何事情。

我在網上挖了好幾個小時。從UIResponder添加其他觸摸方法的存根,其中只包含[super touches ...]。嘗試爲NSTimer調用的方法設置我的全局變量(我很可能錯過了關於全局變量的一些東西......)。這個按鈕是由Storyboard創建的,但是我已經將類設置爲我的自定義類,所以我不認爲UIButton的+(UIButton *)buttonWithType方法正在影響這個。

我錯過了什麼?是否有一些我忘記的小事或者是沒有辦法延遲從UIButton子類中調用[super touchesEnded]?

回答

1

我無法解決這個問題,只能找到解決辦法。

我最後一次解決這個問題的方法是找出在完成塊中的[super touchesEnded ...]是否在一個線程中執行,該線程與它在完成塊之外時執行的線程不同...並且不,它們都是主線程(Apple的關於CATransaction的文檔確實說明它的completionBlock總是在主線程中運行)。

所以,如果有人在敲打他們對這個頭,這是我不那麼優雅的解決方案:

1)在我的UIButton的子類,我創建了一個微弱的屬性稱爲containingVC。

2)在使用了自定義按鈕我不得不這樣做的每一個(啊)VC:在我的自定義的UIButton類

@implemenation VCThatUsesCustomButtonsOneOfWayTooMany 

-(void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 
    self.firstCustomButton.containingVC = self; 
    self.secondCustomButton.containingVC = self; 
    self.thirdCustomButton.containingVC = self; 
    .... 
    self.lastCustomButton.containingVC = self; 
    //you're probably better off using an IBOutletColletion and NSArray's makeObjectPerformSelector:withObject... 
} 

@end 

3)然後,我有這樣的事情:

-(void)animateForPushDismissCurrView 
{ 
    CAAnimation *buttonAnimation = ...make animation 

    [CATransaction begin]; 
    [CATransaction setCompletionBlock:^{ 

     [self.containingVC performSegueWithIdentifier:@"segueID" sender:self.containingVC]; 

    }]; 
    [self.layer addAnimation:buttonAnimation forKey:nil]; 
    [CATransaction commit]; 
} 

4。)然後,在用戶正在與之交互的任何VC中,在確定按鈕完成了它應該做的任何事情之後(在我的情況下,它會檢查模型以確認相關的更改已經完成),每個按鈕必須調用[someCustomButton animateForPushDismissCurrView]然後動畫按鈕按下,然後觸發UIStoryboardSegue實際上消除視圖。

很明顯,這將工作更深入,不只是展開,但你需要額外的邏輯在自定義按鈕的 - (無效)animateForPush方法或完全獨立的方法。

再一次,如果我在這裏錯過了一些東西,我很想知道它是什麼。這看起來像是一個荒謬的數字,可以跳過去完成看似簡單的任務。

最後,也是最重要的一點,如果它不能用於CATransaction的completionBlock中的[super touchesEnded ...]方法,我想知道爲什麼。我懷疑它與線程或Objective-C的超級關鍵字的怪異性有關。