2010-06-03 122 views
7

所以我有一个按钮和动画的问题。基本上,我使用UIView动画制作视图的动画,同时还试图在视图内按钮上轻敲一下。该视图与按钮一样大,视图实际上是UIImageView的一个子类,在按钮下面有一个图像。该视图是放置在Interface Builder中的容器视图的子视图,启用了用户交互并启用了裁剪。所有动画和按钮处理都在此UIImageView子类中完成,而startFloating消息根据需要从单独的类发送。iPhone UIView动画禁用UIButton子视图

如果我没有动画,buttonTapped:消息会被正确发送,但在动画期间它不会被发送。我也尝试过实施touchesEnded方法,并发生相同的行为。

的UIImageView子类的init(我已经用颜色填充,所以我可以看到帧按钮被正确设置它一定):

- (id)initWithImage:(UIImage *)image { 
    self = [super initWithImage:image]; 
    if (self != nil) { 
     // ...stuffs 

     UIButton *tapBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     tapBtn.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
     [tapBtn addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     tapBtn.backgroundColor = [UIColor cyanColor]; 
     [self addSubview:tapBtn]; 

     self.userInteractionEnabled = YES; 
    } 
    return self; 
} 
启动动画(如果我不

动画方法所以

- (void)startFloating { 
    [UIView beginAnimations:@"floating" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:10.0f]; 
    self.frame = CGRectMake(self.frame.origin.x, -self.frame.size.height, self.frame.size.width, self.frame.size.height); 
    [UIView commitAnimations]; 
} 

,是明确的:把这个按钮工作正常)

  • 使用的UIView动画有效地禁用按钮。
  • 禁用动画会使按钮生效。
  • 按钮的大小和位置正确,并且正确地与视图一起移动。

回答

7

动画只是眼睛的糖果。动画滞后于视图的实际移动。当动画开始时,该按钮已经在目的地点。您只会看到正在移动的视图/按钮的电影。

如果您想要在动画过程中点击某个按钮,您必须自己制作动画。

+0

嗯。这看起来相当不错,但与动画的预期相反。当你说“自己制作动画”时,你指的是NSTimer风格的动画?另外我假设实施触摸方法家族会表现出相同的行为? – bensnider 2010-06-03 20:22:11

+0

所以是使用NSTimer动画我能够以这种方式使用按钮。谢谢。 – bensnider 2010-06-04 14:03:21

+0

你也可以自己做触摸追踪,而不是依赖按钮。它仍然需要一些手动动画,但可能会为您提供更好的交互效果。 – axiixc 2011-06-14 19:01:11

5

...遇到了同样的问题,因为我的代码每块做一个大动画。我制作了一个基于NSTimer的解决方案,就像上面提到的解决方案一样,它的工作原理...然而这个运动是生涩的(除非我在每个计时器事件触发器中插入动画)。

因此,由于无论如何都需要动画,所以我找到了一个不需要定时器的解决方案。它动画只有短距离,因此按钮点击仍然准确,只有一个小的错误,这是我的情况是非常不明显的用户界面,并可以减少取决于你的参数。

请注意,在任何给定时间的错误是< 15.0,根据您的动画速度要求,可以降低误差以获得更高的精度。您还可以缩短更长时间的持续时间。

- (void)conveyComplete:(UIView*)v 
{ 
    [self convey:v delay:0]; 
} 

- (void)convey:(UIView*)v delay:(int)nDelay 
{ 
    [UIView animateWithDuration:.5 
          delay:nDelay 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        animations:^
        { 
         CGRect rPos = v.frame; 
         rPos.origin.x -= 15.0; 
         v.frame = rPos; 
        } 
        completion: ^(BOOL finished) 
        { 
         [self conveyComplete:v]; 
        }]; 

} 
20

这解决了问题:做一些测试我相信你是正确的后

[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction 
    ... 
+1

'UIViewAnimationOptionAllowUserInteraction'是我所需要的。谢谢! – buildsucceeded 2012-01-29 14:07:00