0

私は問題があります。ループ内のいくつかのボタンをアニメーション化したいと考えています。シーケンスが繰り返されない場合は機能しますが、配列内でシーケンスが繰り返されると問題が発生します。

- (void)flash:(id)sender delay:(int)time;
 {
     UIButton *button = (UIButton *)sender;     
     NSTimeInterval duration = 1;    
     [UIView animateWithDuration:duration
                           delay:time + 0.5
                         options:UIViewAnimationOptionAutoreverse
                      animations:^{
                          [button setAlpha:0.1f];
                      } completion:^(BOOL finished) {
                          [button setAlpha:1.0f]; 
                      }
      ];
 }

(このメソッドは正常に機能し、メソッドを「フラッシュ」と呼びます)

- (void) play: (id)sender
{
    //buttons is a array that contains buttons => 
    //buttons = [right, left, up, down, nil]


    //positions is a sequence of the buttons positions
    //if buttons positions is [0,1,2,3]
    //positions have the random positions of buttons, example:
    //positions =  [0, 3, 4, 5,8, 7,9]


    int randomNumber;
    NSNumber *index; 

    randomNumber = (arc4random() % 4);
    [positions addObject: [NSNumber numberWithInteger:randomNumber]];
    UIButton *btn;    

    for(int i=0; i<[positions count]; i++)
    {
        index = [positions objectAtIndex:i];
        btn = [buttons objectAtIndex:[index intValue]];
        [self flash:btn delay:i];        



    }

}

位置のシーケンスが繰り返されない場合、たとえば: position= [1,2,3,0]、問題はありません。ただし、シーケンスがたとえば次の場合: 位置 = [0,0,0,1] (数字を繰り返す)、プログラムはアニメーションを表示しません。

4

2 に答える 2

1

呼び出しflashているときに、送信しているボタンが既にアニメーション化されているものと同じである場合、アニメーションが中断されるため、機能しません (遅延のためにまだ実際に開始されていない場合も同様です)。

タイミングを個別に追跡し、遅滞なくアニメーションを使用するようにリファクタリングしてみてください。おそらく 1 つの解決策は、それ自体を再帰的に呼び出す完了ブロックです。

于 2013-07-29T15:18:54.453 に答える
1

このメソッドは、渡すビューをアニメーション化します。

-(void)flashingAnimation:(BOOL)boolVal forView:(UIView *) view{
[UIView animateWithDuration:0.5
                      delay:0.0
                    options:UIViewAnimationOptionRepeat | 
 UIViewAnimationOptionAutoreverse
                 animations:^{
                     view.alpha = 0.0f;
                     view.frame = CGRectMake(view.frame.origin.x*0.75, view.frame.origin.y*0.75, view.frame.size.width*1.5, view.frame.size.height*1.5);
                 }   
                    completion:^(BOOL finished){
                     // Do nothing
                 }];
[UIView commitAnimations];
}

最後に、必要なmethodを渡して上記を呼び出しViewますanimate

[self flashingAnimation:YES forView:Btn]

オプションで追加UIViewAnimationOptionRepeat

于 2013-07-29T15:14:57.857 に答える