为 UIImageview 设置 Uianimation 和 Touch 事件

Posted

技术标签:

【中文标题】为 UIImageview 设置 Uianimation 和 Touch 事件【英文标题】:To set Uianimation and Touch Event for UIImageview 【发布时间】:2013-12-04 05:22:25 【问题描述】:

我正在一个项目中工作,它需要将图像从一个地方动画到另一个我完成了,但我的问题是,当我制作动画时,我没有从 UIImageview 获得触摸事件。所以任何知道的请给出解决方案尽快。

- (void) imageSpawn
  

NSArray *images=  [NSArray arrayWithObjects:[UIImage imageNamed:@"fish_right1.png"],
                   [UIImage imageNamed:@"fish_right2.png"], [UIImage imageNamed:@"fish_right3.png"], [UIImage imageNamed:@"fish_right4.png"], [UIImage imageNamed:@"fish_right14.png"], [UIImage imageNamed:@"fish_right15.png"], [UIImage imageNamed:@"fish_right20.png"], nil];
int currentImageIndex=0;

[UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
    [self.first_fish setImage:[images objectAtIndex:currentImageIndex] ];
completion:Nil ];
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(ballTapped:)];
tapped.numberOfTapsRequired = 1;
[rocket addGestureRecognizer:tapped];
[rocket setUserInteractionEnabled:YES];
  

  -(void)ballTapped:(UIGestureRecognizer *)gesture
   
//here also you can get the tapped point if you need
CGPoint location = [gesture locationInView:gesture.view];
NSLog(@"LOCA X:%d",gesture.view.tag);
 NSLog(@"LOCA y:%f",location.y);

        

问候, Raja.I

【问题讨论】:

请发布您使用的代码。 手势是否在没有动画的情况下工作?你也有你的代表集吗? @KunalBalani 是的,没有动画手势正在工作.. 【参考方案1】:

有一个选项,UIViewAnimationOptionAllowUserInteraction,您可以将其传递给 animateWithDuration:delay:options:animations:completion: 中的 options 参数。您需要将其设置为允许动画期间的交互。

编辑后:这与您制作动画的方式的性质有关。如果您单击图像视图结束的位置(在动画运行时),您将看到手势识别器触发。实际上,在动画开始时,视图的位置已经设​​置为最终值。

要完成这项工作,我认为您必须使用计时器而不是 animateWithDuration 来完成。创建一个重复计时器,并在每次调用时增加视图的 x 位置,并在到达目的地时使计时器无效。这将允许您在视图移动时与其进行交互。

【讨论】:

是的,我也设置了,我已经更新了我的代码,请检查。 好的,但我现在正在为 uiimageview 使用不同的图像,我该如何使用 nstimer。 @Raja,“我现在使用不同的图像”是什么意思? NSTimer,正如 rdelmar 所说,听起来是你最好的选择。 @Raja,我没有看到你对所有这些图像做任何事情。你会在触摸时改变它们吗?你打算给他们做动画吗?图像视图中的图像不应影响动画的工作方式【参考方案2】:

当您为视图设置动画时,您将视图设置为最终状态。这样,您只能在动画的最终位置检测到触摸。

但是,可以绕过该问题。您需要捕获触摸事件并与presentationLayer 进行比较。

-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent *) event 

    CGPoint point = [[touches anyObject] locationInView:self.view];

    if([self.cloudAnimate.layer.presentationLayer hitTest:point]) 
        //do something
    

表示层包含有关与您的 cloudAnimate 关联的 CALayer 的 visual 位置的信息。

【讨论】:

【参考方案3】:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    if([imageView1.layer.presentationLayer hitTest:touchLocation])
       // TODO
    

【讨论】:

以上是关于为 UIImageview 设置 Uianimation 和 Touch 事件的主要内容,如果未能解决你的问题,请参考以下文章

将contentMode设置为UIViewContentModeScaleAspectFit时如何设置UIImageView左对齐或右对齐?

图像设置为零时UIImageView不重绘

获取当前设置为 UIImageView 的图像名称的任何替代方法?

为 UIImageview 设置 Uianimation 和 Touch 事件

UIImageView 设置为 imageWithData 忽略 contentMode

使用叠加按钮为 UIImageView 设置动画