1

タップしたときに点滅させたいTableViewCellがあります(つまり、オフとオンを数回すばやく強調表示します)。

これまでのところ、次のようにタイマーを使用してこの機能を実装しました。

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
      NSTimer *blinkTimer = [[NSTimer scheduledTimerWithTimeInterval:.05 target:self selector:@selector(toggleHighlightedMenuCell) userInfo:nil repeats:YES] retain];
      self.blinkTimer = blinkTimer;
      [blinkTimer release];
} 

-(void) toggleHighlightedMenuCell
{
    if (self.highlightedMenuCell.isHighlighted)
    {
        self.highlightedMenuCell.highlighted = NO;
    }
    else 
    {
        self.highlightedMenuCell.highlighted = YES;        
    }

    self.blinkTimerCounter++;

    if (self.blinkTimerCounter == 2)
    {
        self.blinkTimerCounter = 0;
        [self.blinkTimer invalidate];

        //execute some code
    }
}

//execute some codeこれに関する問題は、点滅が完了する前にセクション内のコードの実行を開始しているように見えることです。これを達成するためのより良い方法を考えられる人はいますか?

4

2 に答える 2

1

あなたの時間間隔は短すぎて効果的に見ることができないと思います。点滅が終わるまで「コードを実行」が実際に実行されているとは思いません。また、retain ステートメントと release ステートメントを実行したり、タイマーを変数に割り当てたりする必要もありません。実行ループはタイマーを保持し、無効になると解放します。ただし、セレクターは、タイマーが引数としてそれ自体を渡すため、名前の後にコロンを付ける必要があります。したがって、コードは次のように少し単純化できます。

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
       [NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(toggleHighlightedMenuCell:) userInfo:nil repeats:YES];
} 

-(void) toggleHighlightedMenuCell:(NSTimer *) aTimer
{
    if (self.highlightedMenuCell.isHighlighted)
    {
        self.highlightedMenuCell.highlighted = NO;
    }
    else 
    {
        self.highlightedMenuCell.highlighted = YES;        
    }

    self.blinkTimerCounter++;

    if (self.blinkTimerCounter == 2)
    {
        self.blinkTimerCounter = 0;
        [aTimer invalidate];

        //execute some code
    }
}

私はあなたがblinkTimerCounterを別の場所で初期化したと仮定しています。

于 2012-12-12T22:31:51.740 に答える
0

いくつかの UIView アニメーションを一緒に連鎖させて、完全に機能するようになりました:

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
            [UIView animateWithDuration:.05 delay:0 options:0 animations:
            ^{
                self.highlightedMenuCell.highlighted = !self.highlightedMenuCell.highlighted;
             }
             completion:^(BOOL finished)
             {
                [UIView animateWithDuration:.05 delay:0 options:0 animations:
               ^{
                   self.highlightedMenuCell.highlighted = !self.highlightedMenuCell.highlighted;
                }
                completion:^(BOOL finished)
                {
                    if ([self.menuViewDelegate respondsToSelector:@selector(menuView:didSelectMenuItem:viaTouchType:)])
                    {
                        [self.menuViewDelegate menuView:self didSelectMenuItem:self.highlightedMenuCell.menuItem viaTouchType:TouchTypeTouchUpInside];
                    }
                }];
            }];
}
于 2012-12-12T23:33:39.517 に答える