Проблемы с созданием интерфейса iPhone Piano UI - PullRequest
0 голосов
/ 11 октября 2010

Я пытаюсь создать пианино для iPhone. Я создал 14 различных UIImageViews в Интерфейсном Разработчике, чтобы представить ключи. С помощью прикосновений «Начать», «Прикосновения», «Прикосновения», «Закругление» и «Прикосновения» Отменено Затем я попытался воспроизвести аудио файлы.

Итак, когда звук воспроизводится, когда вы двигаете пальцем (touchchesMoved), я решил с помощью 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 или что-то еще)

Теперь мои проблемы:

Если переместить палец на другую клавишу без его подъема, звук воспроизводится, но клавиша остается выделенной. Кроме того, если вы снова отодвинете палец назад, звук не воспроизводится.

Кроме того, возникают проблемы, когда вы нажимаете два пальца, просто уберите один. Затем снова звучит сигнал первой клавиши.

Также вы слышите при нажатии одной из черных клавиш, а также звук одной из соседних белых клавиш.

В целом, я использую этот метод для создания пианино UI, много проблем, которые я не могу решить самостоятельно.

Возможно, есть другой способ запрограммировать все приложение? Или есть кто-нибудь советы о том, как я могу решить проблемы?

Спасибо, Jojoce.

PS: простите за плохой английский, я немец.

1 Ответ

1 голос
/ 11 октября 2010

Выход UIButton не предназначен для обработки сложных сенсорных взаимодействий, например, необходимых для глиссандо и т. Д.

Вы можете попробовать поместить изображение клавиатуры в пользовательский подкласс UIView, вычисляя прямоугольники попаданий для всехактивные области (несколько прямоугольников для белых клавиш) и использование обработчика UITouch в подклассе представления для индивидуального отслеживания всех касаний, в том числе того, какие прямоугольники попаданий они первоначально ударили, перенесли на другой, где они были освобождены и т. д.

...