1

少し問題があり、同様の質問をいくつか検索しましたが、うまくいきませんでした。私が作成したユーティリティ クラスのプロジェクト全体で使用する単純なボタン アニメーションがあります。問題は、アニメーションが完了する前にボタンのコードが実行されることです。

ユーティリティ class.m のアニメーションのコード:

+(void)buttonBobble:(UIButton *)button{
  button.transform = CGAffineTransformMakeScale(0.8, 0.8);
  [UIView beginAnimations:@"button" context:nil];
  [UIView setAnimationDuration:.5];
  button.transform = CGAffineTransformMakeScale(1, 1);
  [UIView commitAnimations];
}

ボタンでコードが起動する前にアニメーションが確実に実行されるように私が試みたこと:

[UIView animateWithDuration:0.0f delay:0.0f options: UIViewAnimationOptionTransitionNone  animations:^{
    [Utilities buttonBobble:sender];
}completion:^(BOOL finished){
    //Do stuff
}];

それが機能したとしても、次のようなことができる場所に抽象化したいと思います。

if([Utilities buttonBobble:sender]){
  //Make it send a BOOL so when it's done I execute stuff like normal
}

どんなアイデアでも大歓迎です。

4

2 に答える 2

5

ユーティリティメソッドを変更して、ボブリングが完了したときにボタンが実行する必要があるアクションをカプセル化する完了ブロックを取得します。

+(void)buttonBobble:(UIButton *)button 
     actionWhenDone:(void (^)(BOOL))action
{
    button.transform = CGAffineTransformMakeScale(0.8, 0.8);
    [UIView animateWithDuration:0.5f animations:^{
        button.transform = CGAffineTransformMakeScale(1, 1);
     }
                     completion:action];
}

元のボタン アクション メソッドでは、メソッド内でコードを直接実行するのではなく、そのアクション ブロックを渡します。

- (IBAction)buttonAction:(id)sender
{
    [Utilities buttonBobble:sender
             actionWhenDone:^(BOOL finished){
                // Your code here
        }];
    // Nothing here.
}

設計上の注意として、そのユーティリティ メソッドを のカテゴリに入れることを検討することもできますUIButton

@implementation UIButton (JMMBobble)

- (void)JMMBobbleWithActionWhenDone:(void (^)(BOOL))action
{
    self.transform = CGAffineTransformMakeScale(0.8, 0.8);
    [UIView animateWithDuration:0.5f animations:^{
        self.transform = CGAffineTransformMakeScale(1, 1);
     }
                     completion:action];
} 

次に、アクションは次のようになります

- (IBAction)buttonAction:(id)sender
{
    [sender JMMBobbleWithActionWhenDone:^(BOOL finished){
                // Your code here
        }];
}
于 2013-07-21T02:53:47.340 に答える