UIButton在动画期间没有交互

时间:2011-06-14 15:26:38

标签: iphone uibutton core-animation caanimation

我正在尝试为UIButton制作动画。但在动画期间,没有与UIButton的互动。预期的行为是能够在移动时单击按钮。这是UIButton和动画的代码片段:

UIImage *cloudImage = [UIImage imageNamed:@"sprite.png"];    
UIButton moveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[moveBtn setFrame:CGRectMake(0.0, 80.0, cloudImage.size.width, cloudImage.size.height)];
[moveBtn setImage:cloudImage forState:UIControlStateNormal];
[moveBtn addTarget:self action:@selector(hit:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:moveBtn];
CGPoint newLeftCenter = CGPointMake( 300.0f + moveBtn.frame.size.width / 2.0f, moveBtn.center.y);
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:5.0f];
[UIView setAnimationRepeatCount:HUGE_VALF];
moveBtn.center = newLeftCenter;
[UIView commitAnimations];

hit选择器只显示一个NSLog,以显示该按钮是否响应它。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:25)

尝试将动画选项设置为UIViewAnimationOptionAllowUserInteraction

[UIView animateWithDuration:.2
                      delay: 0
                    options: UIViewAnimationOptionAllowUserInteraction
                 animations:^{ 
                     // animation logic
                 }
                 completion:^(BOOL completed) { 
                     // completion logic
                 }
 ];

答案 1 :(得分:11)

最近这里有一些问题。动画纯粹是视觉效果。您可以点击旧框架中的按钮,直到动画完成,完成后,实际按钮会跳跃。

编辑:

This answer就是我指的。显然,您需要使用NSTimer手动移动按钮。请参阅相关链接的问题/答案。

其他人建议将UIViewAnimationOptionAllowUserInteraction作为UIViewAnimation选项传递。

答案 2 :(得分:0)

此问题是由每个块的大动画引起的。我制作了一个基于NSTimer的解决方案,就像上面建议的一样,但是它起作用了......但是运动是生涩的(除非我在每个定时器事件触发器中插入动画)。

所以,既然动画是必需的,我找到了一个不需要计时器的解决方案。它只是短距离动画,因此按钮点击仍然是准确的,只有一个小错误,我的情况在UI中非常不明显,并且可以根据你的参数减少。

请注意,任何给定时间的错误都是< 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];
                    }];

}

答案 3 :(得分:0)

另一种选择是在您动画的按钮上添加透明按钮。在您的特定情况下,您可能无法使用此功能,因为您正在移动按钮,但您可以创建一个足够大的覆盖按钮,以覆盖从起始位置到最终位置。

我有这个问题,在我的情况下使用UIViewAnimationOptionAllowUserInteraction不起作用。我在UIBarButtonItem(使用initWithCustomView :)创建的UIButton的alpha动画来制作脉动效果,并且该选项不起作用。我不喜欢NSTimer选项(不顺畅),所以最后我添加了一个我不喜欢的覆盖按钮,但是完美无缺。

答案 4 :(得分:0)

对于Swift 4,此代码有效,

UIView.animate(withDuration: 2, delay: 0, options: [.autoreverse, .repeat, .allowUserInteraction],
                   animations: {
                    self.btnCashGame?.frame.origin.y -= 15



    },completion:  { (finished: Bool) in
        self.btnCashGame?.frame.origin.y += 15

    })