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