使用animationImages检测在UIImageView中单击了哪个图像

时间:2012-10-12 11:25:49

标签: ios

我们可以为UIImageview指定图像数组,它会很好地为图像设置动画。我已经将UIImageView类子类化了。

现在,当用户点击图片时,我会捕捉到点击手势,但问题是如何知道动画图像中的哪个图像被点击了?

- (void)setup
{
    self.animationImages = self.bannerImagesArray;
    self.animationDuration = 3.0f;
    self.animationRepeatCount = 0;
    [self startAnimating];

    self.userInteractionEnabled = YES;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageClicked)];
    [self addGestureRecognizer:tapGesture];
}

- (void)imageClicked
{
    NSLog(@"Image clicked");
    // How do i detect which image was clicked here
}

4 个答案:

答案 0 :(得分:3)

我使用了以下解决方法...我没有使用animationImages的内置功能,而是使用自定义NSTimer

为图像设置动画
- (void)setBannerImagesArray:(NSArray *)bannerImagesArray
{
    _bannerImagesArray = bannerImagesArray;
    [self.timer invalidate];
    self.currentImageIndex = 0;
    self.image = [self.bannerImagesArray objectAtIndex:self.currentImageIndex];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                  target:self
                                                selector:@selector(displayNextImage)
                                                userInfo:nil
                                                 repeats:YES];

}

- (void)setup
{
    self.userInteractionEnabled = YES;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageClicked)];
    [self addGestureRecognizer:tapGesture];

    self.bannerImagesArray = nil;
}

- (void)imageClicked
{
    NSLog(@"Image clicked index: %d", self.currentImageIndex);    
}

- (void)displayNextImage
{
    self.currentImageIndex = (self.currentImageIndex + 1) % self.bannerImagesArray.count;
    NSLog(@"Current Image Index %d", self.currentImageIndex);
    self.image = [self.bannerImagesArray objectAtIndex:self.currentImageIndex];
}

答案 1 :(得分:0)

你尝试过self.image吗?它应该有当前的图像。

我希望您需要设计自己的自定义animationView来处理。您可以将imageview添加到视图中并定期更新。

答案 2 :(得分:0)

您想要做的事情很难但并非不可能,并且将使用调试器对您进行一些调查。您需要找到的是在动画期间在每个图像上调用的一些方法。您可能会发现创建一个小型演示项目确实对此有所帮助 - 一个视图项目只包含一些动画的图像。

我不知道的是,在动画运行之后,所有内容都被缓存,或者在显示之前是否显示了单个图像。可能会有一些方法被可靠地调用。

所以你需要创建一个断点并让它记录一些东西,或者写一个UIImage的子类。您正在寻找的是一种在每个图像上调用的方法。例如,'drawInRect'或'CGImage'。一旦你发现在整个动画中调用这样的方法,你的问题就解决了。

然后,您将为UIImage创建子类,并为每个图像赋予一个标记属性和一个委托(使用您编写的新协议),并且当每个图像获得该绘制调用(或CGImage调用)时,它将通知代理它将很快呈现。

当您点击时,图像将是注册它的最后一个提供CGImage的图像,或者它已准备好绘制。

答案 3 :(得分:0)

我想你可以用[gesture locationInView:self]来捕捉手势的位置。如果您还可以捕捉动画的已用时间,则可以准确计算出点击时屏幕上的图像以及点击落在哪个可见图像上。