UIButton在动画过程中没有交互



我正在尝试为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,以显示按钮是否对此做出响应。如有任何帮助,我们将不胜感激。

尝试将动画选项设置为UIViewAnimationOptionAllowUserInteraction

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

最近这里有一些关于这方面的问题。这部动画纯粹是视觉效果。您可以点击旧帧中的按钮,直到动画完成,当动画完成时,实际按钮会跳跃。

编辑:

这个答案就是我所指的。显然,你需要用NSTimer手动移动按钮。有关更多信息,请参阅链接的问题/答案。

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

对于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
    })

这个问题是由每个块的大动画引起的。我做了一个基于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];
                    }];
}

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

我遇到了这个问题,在我的情况下,使用UIViewAnimationOptionAllowUserInteraction不起作用。我在UIBarButtonItem(使用initWithCustomView:创建)中设置UIButton的alpha动画,以产生脉动效果,但该选项不起作用。我也不喜欢NSTimer选项(不平滑),所以最后我只添加了一个覆盖按钮,我不喜欢它,但它工作得很完美。

最新更新