iPhone UIView动画禁用UIButton子视图
所以我对按钮和动画有问题。基本上,我正在使用UIView动画设置视图的动画,同时也尝试在视图中侦听按钮的点击。视图与按钮一样大,视图实际上是UIImageView的一个子类,按钮下面有一个图像。该视图是放置在Interface Builder中的容器视图的子视图,启用了用户交互和剪裁。所有动画和按钮处理都在UIImageView子类中完成,而iPhone UIView动画禁用UIButton子视图,iphone,cocoa-touch,uiview,uibutton,Iphone,Cocoa Touch,Uiview,Uibutton,所以我对按钮和动画有问题。基本上,我正在使用UIView动画设置视图的动画,同时也尝试在视图中侦听按钮的点击。视图与按钮一样大,视图实际上是UIImageView的一个子类,按钮下面有一个图像。该视图是放置在Interface Builder中的容器视图的子视图,启用了用户交互和剪裁。所有动画和按钮处理都在UIImageView子类中完成,而startFloating消息则根据需要从单独的类发送 如果我不做动画,则会正确发送按钮标记:消息,但在动画期间不会发送该消息。我还尝试实现了touches
startFloating
消息则根据需要从单独的类发送
如果我不做动画,则会正确发送按钮标记:
消息,但在动画期间不会发送该消息。我还尝试实现了touchesend
方法,同样的行为也发生了
UIImageView子类init(我用颜色填充了按钮,这样我就可以看到框架被正确设置,确实如此):
启动动画的动画方法(如果我不调用此按钮,则按钮工作正常):
因此,需要明确的是:
- 使用UIView动画可以有效地禁用按钮
- 禁用动画会使按钮工作
- 按钮在屏幕上的大小和位置正确,并随视图正确移动
如果你想在动画中点击一个按钮,你必须自己制作动画。。。。因为我的代码每一个块做一个大型动画,所以我遇到了同样的问题。我做了一个基于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];
}];
}
这就解决了问题:
[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
...
嗯,在做了一些测试之后,我相信你是正确的。不过,这看起来相当刺耳,与人们对动画的期望相反。当你说“自己制作动画”时,你指的是NSTimer风格的动画?此外,我还假设实现touch系列的方法也会表现出相同的行为?因此,是的,使用NSTimer动画,我能够以这种方式使用按钮。谢谢。你也可以自己做触摸跟踪,而不依赖按钮。它仍然需要一些手动动画,但可能会为交互提供更好的效果。
uiviewmanimationoptionalLowUserInteraction
是我所需要的。谢谢
- (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];
}];
}
[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
...