2010-06-26 75 views
0

**解决......看到底部的说明**iPhone:UIControlEventTouchUpInside触发多次

有谁能够给我一个约凸显响应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]; 
    } 
    ... 
} 

的增变setHighlighted:(BOOL)newState_由UI框架(多次而draging拇指在控制)调用。 没有必要跟踪触摸事件来实现突出显示的状态。 简单的办法是重写突变和模仿新的状态...

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

是的,这是一个普遍的问题,并在iPhone可能的错误。

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

类似的东西

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

好的,谢谢。终于找到了解决办法。 当用户触摸控件(启用用户交互)时,框架自动调用mutator/setter setHighlighted。无需跟踪触摸事件以显示突出显示的状态。如果属性的值发生变化,那么只需呈现该状态(在overriden setHighlighted方法中或使用KVO)。 我在我的问题文章中添加了正确的实现。 – MacTouch 2010-06-27 00:39:46