所以我的按钮和动画有问题。基本上,我正在使用UIView动画设置动画,同时还试图在视图内的按钮上轻击。视图与按钮一样大,视图实际上是UIImageView的子类,按钮下方有一个图像。该视图是在Interface Builder中放置的容器视图的子视图,启用了用户交互并启用了剪切。所有动画和按钮处理都在此UIImageView子类中完成,而startFloating
消息则根据需要从单独的类发送。
如果我没有动画,buttonTapped:
消息会被正确发送,但在动画期间它不会被发送。我也尝试过实现touchesEnded
方法,并且会发生相同的行为。
UIImageView子类init(我的按钮填充了一个颜色,所以我可以看到框架设置正确,它确实如此):
- (id)initWithImage:(UIImage *)image {
self = [super initWithImage:image];
if (self != nil) {
// ...stuffs
UIButton *tapBtn = [UIButton buttonWithType:UIButtonTypeCustom];
tapBtn.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
[tapBtn addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
tapBtn.backgroundColor = [UIColor cyanColor];
[self addSubview:tapBtn];
self.userInteractionEnabled = YES;
}
return self;
}
启动动画的动画方法(如果我不调用此按钮,则按钮正常工作):
- (void)startFloating {
[UIView beginAnimations:@"floating" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:10.0f];
self.frame = CGRectMake(self.frame.origin.x, -self.frame.size.height, self.frame.size.width, self.frame.size.height);
[UIView commitAnimations];
}
所以,要明确:
答案 0 :(得分:20)
这解决了这个问题:
[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
...
答案 1 :(得分:7)
动画只是眼睛糖果。动画落后于视图的实际移动。动画开始时,该按钮已位于目标点。你只看到一个视频/按钮移动的电影。
如果您希望在动画期间可以点击按钮,则必须自己制作动画。
答案 2 :(得分:5)
...遇到了同样的问题,因为我的代码每个块都在做一个大型动画。我制作了一个基于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];
}];
}