Перемещайтесь с одной кнопки на другую, не отрывая пальца - PullRequest
2 голосов
/ 07 февраля 2010

У меня есть две кнопки (кнопка 1 и кнопка 2), и если я нажимаю кнопку 1, запускается note1, а если я нажимаю кнопку 2, запускается note 2.

Итак, я пытаюсь сделать следующее: нажать кнопку 1 (примечание 1 запускается) и переместиться к кнопке 2, а затем запустить примечание 2. Например, вы скользите, не поднимая пальца по клавиатуре пианино, и все ноты звучат от c до h.

Я сделал это с UIImageViews, и я сделал это также с UIButtons.

Если я нажимаю c1pianoview, это звучит как "с". Если я нажимаю d1pianoview, это звучит как «д».

Но если я скользю, не поднимая палец с c1pianoview до d1pianoview, это звучит только как "с". Что я не прав? Могу ли я сделать это также с UIButtons?

Касание работает, но скольжение не работает.

Может кто-нибудь помочь мне, пожалуйста? Вот мой код:

-(void)touchesBeganNSSet *)touches withEventUIEvent *)event
{
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint location = [touch locationInView:touch.view];

    if(CGRectContainsPoint(c1pianoview.frame, location))
    { 
      NSString *path = [[NSBundle mainBundle]
      pathForResource: @"c1piano" ofType:@"mp3"];
      AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] 
          initWithContentsOfURL:[NSURL fileURLWithPathath] error:NULL];
      [theAudio play];
    }

    if(CGRectContainsPoint(d1pianoview.frame, location))
    { 
      NSString *path = [[NSBundle mainBundle]
      pathForResource: @"d1piano" ofType:@"mp3"];
      AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] 
          initWithContentsOfURL: [NSURL fileURLWithPathath] error:NULL];
      [theAudio play];
    }
}

* * 1023 Обновление: 1025 **

У меня есть еще вопрос. Теперь у меня есть два UIImageVIews друг на друга. Черная клавиша пианино над двумя белыми клавишами пианино. Если я нажму на черную клавишу, то также прозвучит нота от белой клавиши под ней.

Как мне предотвратить это?

Ответы [ 4 ]

5 голосов
/ 07 апреля 2011

Я думаю, что более простое решение - создать суперпредставление, которое перехватывает все касания и решает, что делать. Затем в IB вы делаете свой вид экземпляром PianoView и делаете все ключи подпредставлениями. Каждый ключ будет иметь тег, который идентифицирует, какой это ключ, поэтому PianoView знает, какую ноту играть. PianoView имеет свойство currentView, которое отслеживает последнее представление в touchesMoved, поэтому он не продолжает пытаться играть одну и ту же клавишу. У меня клавиатура с похожими, но разными требованиями, и этот подход хорошо работает.

Пример кода ниже перехватывает прикосновения в hitTest:withEvent:. Затем в методах touch * он использует стандартную реализацию UIView hitTest:withEvent:, чтобы определить, какая клавиша воспроизводится. Вам придется немного его изменить, если вы хотите поддерживать одновременное воспроизведение клавиш с помощью мультитач.

@implementation PianoView

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // intercept touches
    if ([self pointInside:point withEvent:event]) {
        return self;        
    }
    return nil;
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView* view = [super hitTest: [[touches anyObject] locationInView: self] withEvent: nil];
    // highlight subview under touch
    if (view != nil && view != self) {
        if ([view isKindOfClass:[UIButton class]]) {
            [(UIControl *)view setHighlighted:YES];
        }
        [self setCurrentView:view];
        [self playKey:view];
    }
}

-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    // un-highlight everything
    for (UIView *subview in [self subviews]) {
        if ([subview isKindOfClass:[UIButton class]]) {
            [(UIControl *)subview setHighlighted:NO];
        }
    }
    [self stopPlaying];
    [self setCurrentView:nil];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView* view = [super hitTest: [[touches anyObject] locationInView: self] withEvent: nil];
    if (view != [self currentView]) {
        UIView *oldKey = [self currentView];
        // un-highlight
        if ([oldKey isKindOfClass:[UIButton class]]) {
            [(UIControl *)oldKey setHighlighted:NO];
        }    
        if ([view isKindOfClass:[UIButton class]]) {
            [(UIControl *)view setHighlighted:YES];
        }    
        [self stopPlaying];
        [self playKey:view];
        [self setCurrentView:view];
    }
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView* view = [super hitTest: [[touches anyObject] locationInView: self] withEvent: nil];
    for (UIView *subview in [self subviews]) {
        if ([subview isKindOfClass:[UIButton class]]) {
            [(UIControl *)subview setHighlighted:NO];
        }
    }
    [self stopPlaying];
    [self setCurrentView:nil];
}

@end
1 голос
/ 08 февраля 2010

[Объединить следующий вопрос в исходное сообщение]

0 голосов
/ 07 февраля 2010

Вы, вероятно, можете легко достичь этого, используя события «Touch Down» и «Touch Drag Inside» UIButton.

Если вы хотите использовать подход -touchesMoved:, вы можете использовать переменную для отслеживания последней кнопки, которая активировала звук, и воспроизводить звук, только если текущая кнопка не является той, которая в последний раз воспроизводила звук.

Более подробно:

Объявите UIView *lastButton; в заголовке, а затем:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:touch.view];

if(CGRectContainsPoint(c1pianoview.frame, location) && lastButton != c1pianoview) {
    //play c1
    lastButton = c1pianoview;
}
else if(CGRectContainsPoint(d1pianoview.frame, location) && lastButton != d1pianoview) {
    //play d1
    lastButton = d1pianoview;
}
}

- (void)touchedEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    lastButton = nil;
}

- (void)touchedCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touchesEnded:touches withEvent:event];
}
0 голосов
/ 07 февраля 2010

Вам не нужно:

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