#iphone #objective-c #ios
#iPhone #objective-c #iOS
Вопрос:
У меня есть код, который позволяет вам нажимать кнопки и воспроизводить звук для каждой кнопки, а также проводить пальцами по кнопкам и заставлять каждую кнопку воспроизводить соответствующий звук при входе в область кнопки. Он работает довольно хорошо, за исключением странной ошибки:
Если вы нажмете пальцами на две кнопки одновременно, изначально будут воспроизводиться оба звука. Однако, если вы продолжите удерживать пальцы на кнопке, а затем уберете пальцы с экрана, слегка перемещая один из них (все еще в пределах каждой кнопки), он воспроизведет один из звуков двух кнопок. Как я могу предотвратить это? Я хочу, чтобы звуки воспроизводились, только если вы проводите пальцем по кнопкам или нажимаете на них изначально, а не если вы просто слегка перемещаете их, одновременно нажимая на две кнопки, а затем отпускаете палец.
Ниже приведен мой код:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet *allTouches = [event allTouches];
touchesCount = [allTouches count];
for(UITouch *t in touches) {
CGPoint location = [t locationInView:t.view];
if(CGRectContainsPoint(soundButton1.frame, location))
{
if (!soundButton1.isHighlighted amp;amp; touchesCount < 2){
soundID = @"0";
[self playSound];
[soundButton1 setHighlighted:YES];
}
}
else {
[soundButton1 setHighlighted:NO];
}
if(CGRectContainsPoint(soundButton2.frame, location))
{
if (!soundButton2.isHighlighted amp;amp; touchesCount < 2){
soundID = @"1";
[self playSound];
[soundButton2 setHighlighted:YES];
}
}
else {
[soundButton2 setHighlighted:NO];
}
}
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for(UITouch *t in touches) {
CGPoint location = [t locationInView:t.view];
if(CGRectContainsPoint(soundButton1.frame, location))
{
[soundButton1 setHighlighted:YES];
soundID = @"0";
[self playSound];
}
if(CGRectContainsPoint(soundButton2.frame, location))
{
[soundButton2 setHighlighted:YES];
soundID = @"1";
[self playSound];
}
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
for(UITouch *t in touches) {
CGPoint location = [t locationInView:t.view];
if(CGRectContainsPoint(soundButton1.frame, location))
{
[soundButton1 setHighlighted:NO];
}
if(CGRectContainsPoint(soundButton2.frame, location))
{
[soundButton2 setHighlighted:NO];
}
}
}
Комментарии:
1. Кроме того, это может помочь показать вам, что происходит (одновременные нажатия): Кнопка 1 — коснитесь-> перетащите-> кнопка с поднятым пальцем, Кнопка 2 — коснитесь-> перетащите-> слегка переместите -> воспроизводимый звук
Ответ №1:
Попробуйте отключить звуки на короткий (очень) период. В touchesEnded:withEvent:
проверьте, есть ли у него два касания, затем сделайте что-то вроде этого,
soundDisabled = YES;
Вы можете либо запросить селектор для запуска после задержки
[self performSelector:@selector(enableSound) withObject:nil afterDelay:0.2];
и затем
- (void)enableSound {
soundDisabled = NO;
}
Или вы могли бы подождать, пока второй палец поднимется, а затем
soundDisabled = NO;