2

我有一个按字母顺序划分的表格视图。我在每个部分的页脚的 UIImage 视图中显示动画横幅,并且需要确定单击 UIImage 视图时显示的图像。我在调用 startAnimating 之前设置了一个计时器。计时器每 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++;
}

我计划使用该计时器来索引我的图像数组,以便我可以知道显示的是哪个。任何人都知道为什么它应该在它应该触发的时候不触发?感谢您的帮助!

4

3 回答 3

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];
于 2012-05-22T11:09:51.670 回答
1

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

    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];
    }

希望它应该有所帮助..

于 2012-05-22T13:17:14.350 回答
1

由于您不使用timerCount除非有点击的值,因此您不需要在计时器上更新它:存储开始动画时的时间就足够了。知道每张图片显示 5 秒,您可以通过将点击时间与开始动画的时间之间的差值(以秒为单位)除以 5,然后取除以图像总数的其余部分。

假设您有十张图像,每张图像循环显示五秒钟。假设动画开始于08:15:51。现在假设在动画开始后08:19:23或几秒后点击。212除以五后得到42; 除以 10 的余数,得到2. 因此,您知道用户点击了动画循环中的第三张图片(像往常一样,索引从零开始)。

于 2012-05-23T00:44:26.813 回答