NSTimer什么时候不开火

时间:2012-05-22 10:35:08

标签: ios animation nstimer

我有一个分为字母部分的表格视图。我在每个部分的页脚中的UIImage视图中显示动画横幅,并且需要确定单击UIImage视图时显示的图像。我在调用startAnima之前设置了一个计时器。计时器每5秒触发一次,速度与动画改变的速度相同,但计时器的触发速度要快得多。有时它会在5秒钟内发射2到3次。这是我启动计时器和动画的代码:

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger) section {

...

    imgAdBar = [[bannerView alloc]initWithFrame:CGRectMake(footer.frame.origin.x,footer.frame.origin.y,footer.frame.size.width,footer.frame.size.height)];

    imgAdBar.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@", [animationArray objectAtIndex:0]]]; 
    [imgAdBar saveBannerArray:animationArray];
    [imgAdBar setUserInteractionEnabled:YES];
    imgAdBar.animationImages = images;
    imgAdBar.animationDuration=[images count]*5;
    imgAdBar.animationRepeatCount=0;
    timerCount=0;
    [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerRunning:) userInfo:nil repeats:YES];
    [imgAdBar startAnimating];
    [footer addSubview:imgAdBar];
    footer.backgroundColor = [UIColor clearColor];

}
return footer;
}

这是选择器:

-(void)timerRunning:(NSTimer*)theTimer
{
NSLog(@"timerCount=%d",timerCount);

imgAdBar.timerCount=timerCount;
if (timerCount==numAnimationImages) {
    timerCount=0;
}
NSLog(@"currentImage=%@",[animationArray objectAtIndex:timerCount]);
timerCount++;
}

我计划使用该计时器索引到我的图像数组,以便我可以分辨显示哪个。任何人都知道它为什么不应该开火?谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

在头文件中声明NSTimer作为属性

@propterty (nonatomic, retain) NSTimer *someTimer;

在您启动计时器的行

someTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timerRunning:) userInfo:nil repeats:YES];

不要忘记在 - (void)viewDidUnload

中发布它
[someTimer release];

答案 1 :(得分:1)

您必须使用NSTimer作为属性... 由于viewForFooterInSection被许多部分多次调用,因此在重新初始化之前必须使其无效,或者必须检查以下是否为代码。 的无效:

    NSTimer *timer; // declare in ViewDidLoad
  // code in viewForFooterInSection
    [timer invalidate];
        timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
                         target: self
                         selector: @selector(handleTimer:)
                         userInfo: nil
                         repeats: YES];

检查无

if (timer == nil) {

        timer = [NSTimer scheduledTimerWithTimeInterval: 0.5
                                                 target: self
                                               selector: @selector(handleTimer:)
                                               userInfo: nil
                                                repeats: YES];
    }

希望它应该有所帮助..

答案 2 :(得分:1)

由于除非有点击,否则不使用timerCount的值,您不需要在计时器上更新它:在开始动画时存储时间就足够了。知道每个图像显示五秒钟,您可以通过获取点击时间与开始动画时间之间的差异(以秒为单位)计算所显示图像的索引,将其除以5,然后取除法的总数除以图像总数。

假设您有十张图片,每张图片在循环中显示五秒钟。我们还说动画是从08:15:51开始的。现在让我们假设在动画开始后08:19:23212秒点击一下。除以5后,得到42;将除法的余数除以10,得到2。因此,您知道用户在动画循环中单击了第三个图像(通常,索引从零开始)。