UIButton在动画期间没有交互

Posted

技术标签:

【中文标题】UIButton在动画期间没有交互【英文标题】:UIButton not interacting during animation 【发布时间】:2011-06-14 15:26:38 【问题描述】:

我正在尝试为 UIButton 设置动画。但是在它的动画过程中,没有与 UIButton 的交互。预期的行为是能够在按钮移动时单击它。这是 UIButton 和动画的代码 sn-p:

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

【问题讨论】:

【参考方案1】:

尝试将动画选项设置为UIViewAnimationOptionAllowUserInteraction

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

【讨论】:

效果很好。我有一个 UIButton,它通过为 backgroundColor 设置动画来产生脉冲。添加此选项解决了我的问题。谢谢。 +1 这对我有用。谢谢!如果您为 UIButton 动画使用“animateWithDuration”,这可能是解决方案。 组合多个选项:--objC: UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseIn -- swift: options: [UIViewAnimationOptions.CurveEaseIn, UIViewAnimationOptions.AllowUserInteraction]【参考方案2】:

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

编辑:

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

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

【讨论】:

基本上我的动画是从左到右的,我等不及动画完成了。这首先会破坏在那里有一个按钮的目的,因为它只是为了能够在它的移动过程中触摸它。 啊很酷,谢谢,我添加了一个 touchBegan 并检测到被触摸的矩形,这对我有用,虽然如果在动画幻灯片期间按钮可以点击会很酷:(跨度> 【参考方案3】:

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

    )

【讨论】:

【参考方案4】:

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


【讨论】:

顺便说一句,正在移动的视图包含可点击的 UIButtons。【参考方案5】:

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

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

【讨论】:

以上是关于UIButton在动画期间没有交互的主要内容,如果未能解决你的问题,请参考以下文章

动画期间 UIButton 的 CGRectContainsPoint

在 CABasicAnimation 期间 UIButton 未显示选定状态

UIVIew 块动画后用户交互中断

UIButtons 不会在动画块期间淡出

iPhone:移动没有动画的 UIButton

具有超过 1 个步骤的突出显示状态的 UIButton