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

我认为您的时间间隔太短而无法有效查看。我不认为“执行一些代码”实际上是在执行,直到闪烁结束,它只是看起来像它。也不需要执行保留和释放语句或将计时器分配给变量。运行循环保留计时器,并在它失效时释放它。选择器的名称后应该有一个冒号,因为计时器将自身作为参数传递。所以代码可以稍微简化为:

-(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 回答