iPhone UIView 动画禁用 UIButton 子视图

Posted

技术标签:

【中文标题】iPhone UIView 动画禁用 UIButton 子视图【英文标题】:iPhone UIView Animation Disables UIButton Subview 【发布时间】:2010-06-03 18:53:08 【问题描述】:

所以我在按钮和动画方面遇到了问题。基本上,我正在使用 UIView 动画为视图制作动画,同时还尝试监听视图内按钮上的点击。视图和按钮一样大,视图实际上是 UIImageView 的子类,按钮下方有一个图像。该视图是放置在 Interface Builder 中的容器视图的子视图,其中启用了用户交互并启用了剪辑。所有的动画和按钮处理都在这个 UIImageView 子类中完成,而 startFloating 消息是根据需要从单独的类发送的。

如果我不做动画,buttonTapped: 消息会正确发送,但在动画期间不会发送。我也尝试过实现touchesEnded 方法,并且发生了相同的行为。

UIImageView 子类初始化(我将按钮填充了颜色,因此我可以看到框架设置正确,确实如此):

- (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];

所以,要清楚:

使用 UIView 动画可以有效地禁用按钮。 禁用动画会使按钮起作用。 按钮在屏幕上的大小和位置都正确,并且随着视图正确移动。

【问题讨论】:

【参考方案1】:

这解决了问题:

[UIView animateWithDuration:20 delay: 0.0 options: UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
  ...

【讨论】:

UIViewAnimationOptionAllowUserInteraction 是我需要的。谢谢!【参考方案2】:

动画只是养眼。动画滞后于视图的实际移动。动画开始时,按钮已经位于目标点。你只是看到了视图/按钮移动的电影。

如果您希望按钮在动画期间可点击,您必须自己制作动画。

【讨论】:

嗯,经过一些测试,我相信你是正确的。不过,这似乎相当笨拙,与对动画的期望相反。当您说“自己制作动画”时,您指的是 NSTimer 风格的动画?我还假设实现 touches 系列方法会表现出相同的行为? 所以是的,使用 NSTimer 动画我能够以这种方式使用按钮。谢谢。 您也可以自己进行触摸跟踪,而完全不依赖按钮。它仍然需要一些手动动画,但可能会为您提供更好的交互结果。【参考方案3】:

... 遇到了同样的问题,因为我的代码每个块都制作一个大型动画。我制作了一个基于 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];
                    ];


【讨论】:

以上是关于iPhone UIView 动画禁用 UIButton 子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 iPhone 中的 UIView 动画为带有右帽的水平条设置动画

没有uiview动画的iphone页面卷曲

如何在 iPhone 中隐藏/显示带有动画的 UIView

自动布局中断 UIView 动画

uiview 动画过去可以在 iphone sdk 2.2 上运行,现在它不能在 sdk 3.0 上运行

在iPhone中禁用UIButton中的触摸动画