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