Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone UIView动画禁用UIButton子视图_Iphone_Cocoa Touch_Uiview_Uibutton - Fatal编程技术网

iPhone UIView动画禁用UIButton子视图

iPhone UIView动画禁用UIButton子视图,iphone,cocoa-touch,uiview,uibutton,Iphone,Cocoa Touch,Uiview,Uibutton,所以我对按钮和动画有问题。基本上,我正在使用UIView动画设置视图的动画,同时也尝试在视图中侦听按钮的点击。视图与按钮一样大,视图实际上是UIImageView的一个子类,按钮下面有一个图像。该视图是放置在Interface Builder中的容器视图的子视图,启用了用户交互和剪裁。所有动画和按钮处理都在UIImageView子类中完成,而startFloating消息则根据需要从单独的类发送 如果我不做动画,则会正确发送按钮标记:消息,但在动画期间不会发送该消息。我还尝试实现了touches

所以我对按钮和动画有问题。基本上,我正在使用UIView动画设置视图的动画,同时也尝试在视图中侦听按钮的点击。视图与按钮一样大,视图实际上是UIImageView的一个子类,按钮下面有一个图像。该视图是放置在Interface Builder中的容器视图的子视图,启用了用户交互和剪裁。所有动画和按钮处理都在UIImageView子类中完成,而
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
  ...