Этот вопрос слишком примитивен, но я пытался последние 8 часов, и он поглощает мою энергию (и уровень уверенности тоже:))
В моем классе я зарегистрировался на Targetedкасания.
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:YES];
Я хотел бы проверить, выполняет ли пользователь одно касание или двойное касание.В методе ccTouchBegan сначала выполняется касание с помощью singleTap, а затем выполняется касание с помощью doubleTap.Я нашел очень интересное решение для этого на одном из форумов Cocos2d.(Я не могу найти его сейчас ..)
Решение выглядит следующим образом.
switch (touch.tapCount) {
case 2:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTouch:) object:singleTouchLocation];
// Handle Double Touch here
break;
case 1:
self.singleTapLocation = ccp(location.x,location.y);
self.singleTouchLocation = touch;
[self performSelector:@selector(handleSingleTouch:) withObject:touch afterDelay:0.3
];
break;
}
Все выглядит нормально.По сути, вы планируете обработчик одним касанием с задержкой и смотрите, действительно ли это двойное касание.Если это двойное касание, отмените обработчик одно касания и выполните логику для двойного касания.
Но моя проблема в том, что в обработчике с одним касанием (handleSingleTouch) я добавляю CCSprite в пользовательский интерфейс.Это действие не работает.Спрайт не добавляется.(Хотя метод называется.).На самом деле это работает, если я вызываю селектор без задержки, но с задержкой, спрайт не добавляется.
Я не эксперт по Objective C, поэтому я прошу прощения, если вопрос слишком примитивен.
Редактировать 1: Оригинальный поток .
Редактировать 2: Отправка ручки SingleTouch .. только соответствующий код.
-(void) handleSingleTouch:(UITouch * ) touch {
CGPoint location = [touch locationInView: [touch view]];
CGPoint glLocation = [MainSceneLayer locationFromTouch:touch];
//Single tap
CCLOG(@"Single tap: Adding marker image");
if(zoomedOut) {
CGPoint globalCoordinates = [quadConvertor convertLocalToGlobal:location
inActiveQuadrant:activeQuadrant];
if( [self isTouchValidForSelectedItem:globalCoordinates] == Matched) {
[self addMarkerImages:glLocation];
} else if([self isTouchValidForSelectedItem:globalCoordinates] == NotMatched) {
[missedLabel stopAllActions];
for (ImageQuadrants* quad in quadrants) {
if(quad.quadrantNumber == activeQuadrant) {
missedLabel.position = ccp((quad.center.x * -1)+glLocation.x , (quad.center.y * -1)+glLocation.y);
//markers.position = ccp((quad.center.x * -1)+touchPosition.x , 320);
}
}
id blinkAction = [CCBlink actionWithDuration:1 blinks:3];
id makeInvible = [CCCallFunc actionWithTarget:self selector:@selector(makeInvisible:)];
id seq = [CCSequence actions:blinkAction, makeInvible, nil];
[missedLabel runAction:seq];
} else {
[alreadyAccountedLabel stopAllActions];
for (ImageQuadrants* quad in quadrants) {
if(quad.quadrantNumber == activeQuadrant) {
alreadyAccountedLabel.position = ccp((quad.center.x * -1)+glLocation.x , (quad.center.y * -1)+glLocation.y);
//markers.position = ccp((quad.center.x * -1)+touchPosition.x , 320);
}
}
id blinkAction = [CCBlink actionWithDuration:1 blinks:3];
id makeInvible = [CCCallFunc actionWithTarget:self selector:@selector(makeInvisible1:)];
id seq = [CCSequence actions:blinkAction, makeInvible, nil];
[alreadyAccountedLabel runAction:seq];
}
}
swipeStartPoint = [touch locationInView:touch.view];
}