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 动画为带有右帽的水平条设置动画