0

iPhoneのピアノアプリを作ろうとしています。キーを表すために、Interface Builder で 14 の異なる UIImageView を作成しました。touchesBegan、touchesMoved、touchesEnded、および touchesCancelled を使用して、オーディオ ファイルを再生しようとしました。

したがって、指を動かしたときにサウンドが再生されると (touchesMoved)、NSMutableArray で解決しました。

コード (C キーのみをコピーしました。他のキーのコードは同じです) は次のようになります。

私の.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

私の .m ファイル:

#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

(「AudioServicesPlaySystemSound」をOpenALなどに置き換えます)

今私の問題:

指を離さずに指を別のキーに移動すると、サウンドは再生されますが、キーは強調表示されたままになります。また、もう一度指を戻すと音は鳴りません。

また、2 本の指を押すと問題が発生し、1 本の指を離すだけです。次に、最初のキーのトーンが再び再生されます。

また、黒鍵の 1 つを押すと、隣接する白鍵の音も聞こえます。

全体として、私はこの方法を使用してピアノ UI を作成しましたが、一人では解決できない多くの問題があります。

アプリ全体をプログラムする別の方法はありますか? または、問題を解決する方法についてのヒントはありますか?

ありがとうジョジョセ。

PS: 下手な英語で申し訳ありません。私はドイツ人です。

4

1 に答える 1

1

UIButton アウトレットは、グリッサンドなどに必要な複雑なタッチ操作を処理するためのものではありません。

キーボードのグラフィックをカスタム UIView サブクラスに配置し、すべてのアクティブ領域のヒット四角形 (白キーの複数の四角形) を計算し、ビュー サブクラスで UITouch ハンドラーを使用してすべてのタッチを個別に追跡してみてください。最初にヒットした長方形、別の長方形に移動したもの、それらが解放された場所など。

于 2010-10-11T16:53:15.450 に答える