iPhone: UIControlEventTouchUpInside срабатывает несколько раз - PullRequest
0 голосов
/ 26 июня 2010

** решено ... см. Пояснение внизу **

Может кто-нибудь дать мне подсказку о выделении элемента управления в ответ на UIControlEventTouchUpInside?

Что я хочу достичь, так это подсветкаэффект, аналогичный UITableViewCell, при касании.В следующем коде я изменяю альфа-значение представления подсветки, когда пользователь подправляет внутри элемента управления.К сожалению, событие вызывается несколько раз, когда вы удерживаете большой палец на дисплее и перемещаете его вверх или вниз (в моем понимании это жест 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_ вызывается платформой пользовательского интерфейса (несколько раз при перетаскивании большого пальца на элемент управления),Нет необходимости отслеживать сенсорные события для реализации выделенного состояния.Самое простое решение - переопределить мутатор и имитировать новое состояние ...

-(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 Ответ

1 голос
/ 26 июня 2010

Да, это распространенная проблема, и, возможно, ошибка в iPhone.

Но решение простое, вы можете определить переменную экземпляра в вашем классе контроллера представления и управлять этой переменной при вызове вашей функции.

Нечто подобное

your_method {
   if(control_var)
       control_var=NO;
   else {
       //APPLICATION LOGIC
      control_var=YES;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...