为 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 设置 Uianimation 和 Touch 事件