13

我正在尝试为 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 来显示按钮是否响应它。任何帮助,将不胜感激。

4

5 回答 5

29

尝试将动画选项设置为UIViewAnimationOptionAllowUserInteraction.

[UIView animateWithDuration:.2
                      delay: 0
                    options: UIViewAnimationOptionAllowUserInteraction
                 animations:^{ 
                     // animation logic
                 }
                 completion:^(BOOL completed) { 
                     // completion logic
                 }
 ];
于 2011-06-14T15:53:33.467 回答
13

最近这里有一些关于此的问题。动画是纯视觉的。您可以在它的旧框架中点击按钮,直到动画完成,当它完成时,实际的按钮会跳转。

编辑:

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

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

于 2011-06-14T15:52:22.077 回答
2

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

    })
于 2019-01-18T11:16:29.147 回答
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];
                    }];

}
于 2011-09-02T05:33:30.643 回答
0

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

我遇到了这个问题,在我的情况下使用 UIViewAnimationOptionAllowUserInteraction 不起作用。我正在为 UIBarButtonItem(使用 initWithCustomView 创建)中的 UIButton 的 alpha 设置动画以产生脉动效果,但该选项不起作用。我也不喜欢 NSTimer 选项(不流畅),所以最后我只是添加了一个我不喜欢的叠加按钮,但可以完美地工作。

于 2014-05-12T11:14:06.917 回答