Создание реалистичного Strum на iPhone? - PullRequest
0 голосов
/ 08 февраля 2011

Итак, у меня есть приложение для гитары, которое играет аккорды, как автофокус.Я создал следующий класс UIView, чтобы превратить удар в ударную, когда пальцы пользователя проводят по струнам.

#import "swipetest.h"


@implementation swipetest

@synthesize eStringButton, aStringButton, dStringButton, gStringButton, bStringButton, ehStringButton;



- (void)viewDidLoad {
[NSThread detachNewThreadSelector:@selector(isolateStrums) toTarget:self withObject:nil]; }



- (void)isolateStrums {  

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
[self performSelectorOnMainThread:@selector(touchesMoved) withObject:nil waitUntilDone:NO];  
[pool release];  

}  
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

CGPoint location = [[touches anyObject] locationInView:self];
UIView *subview = [self hitTest:location withEvent:event];
if ([subview isKindOfClass:[UIButton class]])
{



 if(CGRectContainsPoint(eStringButton.frame, location)) {
     [eStringButton setHighlighted:YES];
 [eStringButton sendActionsForControlEvents:UIControlEventTouchDown];
 [NSTimer scheduledTimerWithTimeInterval:strumDelay target:self selector:@selector(ETimer) userInfo:nil repeats:NO];

    }

  else {

      [eStringButton setHighlighted:NO];


  }


  if(CGRectContainsPoint(ehStringButton.frame, location)) {
      [ehStringButton setHighlighted:YES];
      [ehStringButton sendActionsForControlEvents:UIControlEventTouchDown];

  }
  else {

      [ehStringButton setHighlighted:NO];

  }


if(CGRectContainsPoint(bStringButton.frame, location)) {
      [bStringButton setHighlighted:YES];
      [bStringButton sendActionsForControlEvents:UIControlEventTouchDown];

  }
else {

     [bStringButton setHighlighted:NO];


}

 if(CGRectContainsPoint(aStringButton.frame, location)) {
    [aStringButton sendActionsForControlEvents:UIControlEventTouchDown];
        [aStringButton setHighlighted:YES];

    }
else {

    [aStringButton setHighlighted:NO];


}


 if(CGRectContainsPoint(dStringButton.frame, location)) {
        [dStringButton setHighlighted:YES];

    [dStringButton sendActionsForControlEvents:UIControlEventTouchDown];

    }
else {
    [dStringButton setHighlighted:NO];



}
     if(CGRectContainsPoint(gStringButton.frame, location)) {
       [gStringButton setHighlighted:YES];
        [gStringButton sendActionsForControlEvents:UIControlEventTouchDown];
    }
    else {
        [gStringButton setHighlighted:NO];



    }




}       

}





- (void)dealloc {
[eStringButton release];
[aStringButton release];
[bStringButton release];
[gStringButton release];
[dStringButton release];
[ehStringButton release];



[super dealloc];
}



@end

Проблема заключается в том, что представление регистрирует быстрые "попадания" огня даже при нормальной скорости ударных.Как я могу замедлить реакцию интерфейса?Я не могу использовать любые команды, которые приостанавливают NSthread.Есть ли способ отключить кнопку UIB на заранее определенный период времени после того, как он получит сообщение UIControlEventTouchDown, скажем, на 0,1 секунды?Должен ли я создавать отдельные потоки для каждой строки и приостанавливать эти потоки?Прямо сейчас это вроде работает, но может легко превратиться в «матрицу» звучащей заикающейся гитары.Не хорошо.

1 Ответ

1 голос
/ 08 февраля 2011

Есть ли способ отключить UIButton? в течение заранее определенного периода времени после получения UIControlEventTouchDown сообщение, скажем на 0,1 секунды?

Конечно - вы можете использовать NSTimer для изменения свойства кнопки .userInteractionEnabled. Просто установите его на «НЕТ», как только вы обнаружите касание, и включите таймер, чтобы установить его на «ДА» через заданное число / доли секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...