2010-10-11 27 views
0

J'essaie de créer une application pour piano iPhone. J'ai créé 14 UIImageViews différents dans Interface Builder, pour représenter les clés. Avec touchesBegan, touchesMoved, toucheEnded et toucheCancelled j'ai ensuite essayé de lire les fichiers audio.Problèmes liés à la création d'une interface utilisateur pour piano iPhone

Donc, une fois que le son est joué lorsque vous bougez votre doigt (touchesMoved) j'ai résolu avec un NSMutableArray.

Le code (je copié uniquement pour C Key, le code pour les autres touches est le même) ressemble à ceci:

mon fichier .h:

@interface PianoViewController : UIViewController { 
    IBOutlet UIImageView *pianoButtonC; 
    IBOutlet UIImageView *pianoButtonCC; 
    IBOutlet UIImageView *pianoButtonD; 
    IBOutlet UIImageView *pianoButtonDb; 
    IBOutlet UIImageView *pianoButtonDbDb; 
    IBOutlet UIImageView *pianoButtonE; 
    IBOutlet UIImageView *pianoButtonEb; 
    IBOutlet UIImageView *pianoButtonF; 
    IBOutlet UIImageView *pianoButtonG; 
    IBOutlet UIImageView *pianoButtonGb; 
    IBOutlet UIImageView *pianoButtonH; 
    IBOutlet UIImageView *pianoButtonHb; 
    CGPoint location; 
    NSMutableArray *lastButtons; 
    UITouch *touch; 
} 

@end 

mon .m fichier:

#import "PianoViewController.h" 
@implementation PianoViewController 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
[self.view setMultipleTouchEnabled:YES]; 
    lastButtons = [[NSMutableArray alloc] init]; 
    [lastButtons insertObject:@"notPressedC" atIndex:0]; 
} 

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

    for(touch in [event allTouches]){ 

     if(CGRectContainsPoint(pianoButtonC.frame, [touch locationInView:touch.view]) && [lastButtons containsObject:@"notPressedC"]) { 
      [pianoButtonC setHighlighted: YES]; 
      NSString *path = [[NSBundle mainBundle] pathForResource:@"pianoC"ofType:@"wav"]; 
      SystemSoundID soundID; 
      AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID); 
      AudioServicesPlaySystemSound (soundID); 

      [lastButtons replaceObjectAtIndex:0 withObject:@"pressedC"]; 
     } 

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


    for(touch in [event allTouches]){ 

     if(CGRectContainsPoint(pianoButtonC.frame, [touch locationInView:touch.view]) && [lastButtons containsObject:@"notPressedC"]) { 
      [pianoButtonC setHighlighted: YES]; 
      NSString *path = [[NSBundle mainBundle] pathForResource:@"pianoC"ofType:@"wav"]; 
      SystemSoundID soundID; 
      AudioServicesCreateSystemSoundID((CFURLRef) [NSURL fileURLWithPath:path], &soundID); 
      AudioServicesPlaySystemSound (soundID); 

      [lastButtons replaceObjectAtIndex:0 withObject:@"pressedC"]; 
     } 

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

    [lastButtons replaceObjectAtIndex:0 withObject:@"notPressedC"]; 
    [pianoButtonC setHighlighted: NO]; 
} 


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

    [self touchesEnded:touches withEvent:event]; 

} 

// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight 
      ); 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 


} 


- (void)dealloc { 
    [super dealloc]; 
    [lastButtons release]; 

} 

@end 

(je remplacerai le "AudioServicesPlaySystemSound" avec OpenAL ou autre chose)

Maintenant mes problèmes:

Si vous déplacez le doigt vers une autre touche sans qu'il se soulève, le son est joué, mais la touche reste en surbrillance. De plus, si vous reculez à nouveau le doigt, aucun son n'est joué.

De plus, vous avez des problèmes lorsque vous appuyez sur deux doigts, enlevez-en un. Ensuite, la tonalité de la première touche est rejouée.

Également vous entendez lorsque vous appuyez sur l'une des touches noires, également le son l'une des touches blanches adjacentes.

Dans l'ensemble, j'ai utilisé cette méthode pour créer une interface utilisateur de piano de nombreux problèmes que je ne peux pas résoudre seul.

Y at-il peut-être une autre façon de programmer l'application entière? Ou a des conseils sur la façon dont je peux résoudre les problèmes?

Merci Jojoce.

PS: Désolé pour le mauvais anglais, je suis allemand.

Répondre

1

La sortie UIButton ne vise pas à gérer les interactions tactiles complexes tels que requis pour glissando, etc.

Vous pouvez essayer de mettre un graphique de votre clavier dans une sous-classe UIView personnalisée, le calcul des rectangles de vie pour tous les actifs zones (rectangles multiples pour les touches blanches), et en utilisant un gestionnaire UITouch dans la sous-classe vue pour suivre toutes les touches individuellement, y compris ce que frappent les rectangles initialement, sont déplacés à l'autre, où ils sont relâchés, etc

+0

Merci pour la réponse rapide! Et comment puis-je mettre les touches en surbrillance? Et vous pourriez me donner un exemple de code parce que je suis encore un débutant en programmation? Ce serait très très gentil. Merci – Jojoce