2010-02-07 2 views
2

У меня есть две кнопки (кнопка 1 и кнопка 2), и если я нажму кнопку 1, начнется запись 1, и если я нажму кнопку 2, начнется запись 2.Сдвиньте одну кнопку на другую, не поднимая пальца.

Так что я пытаюсь сделать это: нажмите кнопку «один» (отметьте «1») и «СЛАЙД» на кнопку2, а затем начните замечать2. Как и в, вы скользите, не поднимая пальцем по клавиатуре пианино, и все ноты от звука c до h.

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

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

Но если я скольжу без поднятия пальца от c1pianoview до d1pianoview, это звучит только как «c». Что я не так? Могу ли я также сделать это с помощью 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]; 
    } 
} 

Update:

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

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

ответ

0

Вам не нужен:

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

ОК, я сделал это с помощью touchsMoved .., но теперь каждый раз, когда я скольжу в своем ImageView, звучит примечание. Но я хочу, чтобы записка только один раз звучал. что я не так? THX за помощь! – user268086

+0

@franhu - Dimitris избил меня к нему – willcodejavaforfood

0

Вы можете, вероятно, добиться этого легко с помощью «Touch Down» и «потрогать Drag внутри» события 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

Хорошо, что он не работает с TouchDragInside ... ты можешь помочь мне с прикосновениемМожет ли ... кариться? thx – user268086

+0

Я отредактировал мое сообщение. Дайте мне знать, если это поможет :) – Dimitris

+0

Извините, но он все еще не работает. Если я перехожу внутрь c1pianoview или d1pianoview, это примечание звучит при каждом небольшом движении. Поэтому, если я перехожу от c1pianoview к d1pianoview, там звучит около 10 c-notes и 10 d-notes. =), но я хочу услышать только одну c-ноту и одну d-ноту! Знаете, почему я не работаю? THX для помощи! greez – user268086

1

[Объединять еще один вопрос в исходное сообщение]

5

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

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

@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 
+0

Хороший ответ. Выглядит правильно, хотя и не испытал его. Кажется, никакой другой ответ на Stackoverflow не был прав, кроме этого. – Jonny

+0

Обнаружена ошибка, вызывающая крах внутри 'touchhesMoved'. Второй '[(UIControl *) oldKey setHighlighted: YES];' должен быть '[(UIControl *) view setHighlighted: YES];'. Кроме этого, это действительно работает. – Jonny

+0

Спасибо за исправление, обновил мой ответ. –

Смежные вопросы