iPhone:UIControlEventTouchUpInside多次触发

时间:2010-06-26 13:41:47

标签: iphone event-handling

**解决了......见底部的解释**

任何人都可以给我一个关于突出显示控件以响应UIControlEventTouchUpInside的提示吗?

我想要实现的是触摸时类似于UITableViewCell的高亮效果。 在以下代码中,我在用户修改时更改突出显示视图的Alpha值 控制内部。不幸的是,事件被多次触发,当一个人将拇指放在显示器上并向上或向下移动时(据我所知它是一个UIControlEventTouchDragInside手势)。 它出什么问题了?我真的必须在动画期间删除事件目标吗?

-(id)initWithFrame:(CGRect)frame_
{
   if (self = [super initWithFrame:frame_])
   {
      ...
      [self setMultipleTouchEnabled:NO];
      [self addTarget:self action:@selector(touchUpInside) forControlEvents:UIControlEventTouchUpInside];
   }
   return self;
}

-(void)touchUpInside
{
   [self setHighlighted:YES];
}

-(void)animationFinished
{
   // Remove the highlight animated
   [self setHighlighted:NO];
}

-(void)setHighlighted:(BOOL)highlighted_
{
   BOOL oldValue = [self isHighlighted];
   [super setHighlighted:highlighted_];
   if (highlighted_ != oldValue)
   {
      [UIView beginAnimations:nil context:nil];
      [UIView setAnimationDuration:0.35f];
      if (highlighted_)
      {  
         [UIView setAnimationDelegate:self];
         [UIView setAnimationDidStopSelector:@selector(animationFinished)];
         [[self highlightView] setAlpha:0.5f];
      }
      else
      {
         [[self highlightView] setAlpha:0.0f];
      }
      [UIView commitAnimations];
   }
   ...
}

mutator setHighlighted:(BOOL)newState_由UI框架调用(多次在控件上拖动拇指)。 无需跟踪触摸事件即可实现突出显示的状态。 最简单的解决方案是覆盖mutator并模仿新状态......

-(void)setHighlighted:(BOOL)highlighted_
{
   BOOL oldValue = [self isHighlighted];
   if (highlighted_ != oldValue)
   {
      [super setHighlighted:highlighted_];
      // NSLog(@"highlighted: %d", highlighted_);
      [UIView beginAnimations:nil context:nil];
      [UIView setAnimationDuration:0.35f];
      [[self highlightView] setAlpha:(highlighted_?0.5f:0.0f)];
      [UIView commitAnimations];
   }
}

也许,TouchUpInside事件会被触发一次......正如预期的那样。

谢谢, MacTouch

1 个答案:

答案 0 :(得分:1)

是的,这是一个常见问题,可能是iPhone中的一个错误。

但解决方案很简单,您可以在视图控制器类中定义实例变量,并在调用函数时控制该变量。

像这样的东西

your_method {
   if(control_var)
       control_var=NO;
   else {
       //APPLICATION LOGIC
      control_var=YES;
   }
}