为什么切换视图时AVAudioPlayer的stop方法不起作用 [英] Why does the AVAudioPlayer stop method not work when switching views

查看:75
本文介绍了为什么切换视图时AVAudioPlayer的stop方法不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个iPhone应用程序,可以显示图像并播放从主菜单中选择的音频.

I have an iphone app that displays images and plays audio selected from a main menu.

用户单击按钮以选择所需的图像/音频组合.用动画切换视图的代码很好用.

The user clicks on a button to select the image/audio combo they want. The code to switch the views with animation works fine.

在新视图中显示图像,播放,暂停,滑动和停止音频的所有代码也可以正常工作.

All of the code to display the image, play, pause, scrub, and stop the audio while in the new view works fine too.

但是,当用户单击主菜单"按钮时,我希望停止播放音频.我正在使用viewWillDisappear:(BOOL)动画来调用stop方法:

However, when the users clicks the Main Menu button I want the playing audio to stop. I am using viewWillDisappear:(BOOL)animated to call the stop method:

-(void)viewWillDisappear:(BOOL)animated {
audioPlayer.stop;
[super viewWillDisappear: animated];}

当用户切换回主菜单视图时,此代码不会停止声音.有一个更好的方法吗?我在做错什么吗?

This code doesn't stop the sound when the user switches back to the main menu view. Is there a better way to do this? Am I doing something wrong?

这是上面的代码片段所在的整个类的代码:

Here is the code from the entire class where the snippet above resides:

#import "twelthPoem.h"

UIImageView *largeImageView;

@implementation twelthPoem

-(void)resetControls
{
audioPlayer.currentTime = 0;
scrubber.value = 0;
[playButton setImage:[UIImage imageNamed:@"play_HL.png"] 
    forState:UIControlStateNormal];
}

-(void)play:(id)sender {


if (! audioPlayer.playing)  {
audioPlayer.play;
[playButton setImage:[UIImage imageNamed:@"pauseHL.png"] forState:UIControlStateNormal];
}
else {
audioPlayer.pause;
[playButton setImage:[UIImage imageNamed:@"play_HL.png"]          forState:UIControlStateNormal];
}

[self becomeFirstResponder];
}

-(void)stop:(id)sender {

audioPlayer.stop;
[self resetControls];
}

-(void)changeVolume:(id)sender {

audioPlayer.volume = volume.value;
[self becomeFirstResponder];
}

-(void)scrub:(id)sender {

if (audioPlayer.playing) {

audioPlayer.pause;
audioPlayer.currentTime = scrubber.value;
audioPlayer.play;
}
else
audioPlayer.currentTime = scrubber.value;
[self becomeFirstResponder];
}

-(void)createControls {

//play/pause button
playButton = [UIButton buttonWithType:UIButtonTypeCustom];
[playButton setFrame:CGRectMake(60,405,80,20)];
[playButton setImage:[UIImage imageNamed:@"play_HL.png"] forState:UIControlStateNormal];
[playButton addTarget:self action:@selector(play:) 
 forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:playButton];

//stop button
stopButton = [UIButton buttonWithType:UIButtonTypeCustom];
[stopButton setFrame:CGRectMake(180,405,80,20)];
[stopButton setImage:[UIImage imageNamed:@"stopHL.png"] forState:UIControlStateNormal];
[stopButton addTarget:self action:@selector(stop:) 
 forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:stopButton];

//volume control
volume = [[UISlider alloc] initWithFrame:CGRectMake(10,445,145,20)];
[volume addTarget:self action:@selector(changeVolume:) 
 forControlEvents:UIControlEventValueChanged];
volume.minimumValue = 0.0;
volume.maximumValue = 1.0;
volume.value = audioPlayer.volume;
volume.continuous = YES;
[self.view addSubview:volume];

//scrubber control
scrubber = [[UISlider alloc] initWithFrame:CGRectMake(165,445,145,20)];
[scrubber addTarget:self action:@selector(scrub:) 
   forControlEvents:UIControlEventValueChanged];
scrubber.minimumValue = 0.0;
scrubber.maximumValue = audioPlayer.duration;
scrubber.value = audioPlayer.currentTime;
scrubber.continuous = NO;
[self.view addSubview:scrubber];

}

- (void)remoteControlReceivedWithEvent:(UIEvent *)event {

switch (event.subtype)
{
case UIEventSubtypeRemoteControlTogglePlayPause:
    [self play:nil];
    break;

case UIEventSubtypeRemoteControlNextTrack:
    //do nothing
    break;

case UIEventSubtypeRemoteControlPreviousTrack:
    //do nothing
    break; 
}
}

- (BOOL)canBecomeFirstResponder {

return YES;
}

-(void)viewDidLoad {    

//for scrolling the image

[super viewDidLoad];

CGRect scrollFrame = CGRectMake(0,40,320,350);
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
scrollView.minimumZoomScale = 1.0;
scrollView.maximumZoomScale = 1.5;
scrollView.delegate = self;


UIImage *bigImage = [UIImage imageNamed:@"birches.png"];



largeImageView = [[UIImageView alloc] initWithImage:bigImage];


[scrollView addSubview:largeImageView];
scrollView.contentSize = largeImageView.frame.size; //important!



[self.view addSubview:scrollView];

[scrollView release];


//for playing the recording

NSString *filePath = [[[NSBundle mainBundle] resourcePath] 
          stringByAppendingPathComponent:@"birches_final_mp3.mp3"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filePath];

NSError *error = nil;

OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);    
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
                  sizeof (sessionCategory), 
                  &sessionCategory);
AudioSessionSetActive(YES);

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL 
                         error:&error];

      if (error )
    NSLog(@"An error occurred: %@",error);
        else
    {
    audioPlayer.volume = 0.3;
    [audioPlayer prepareToPlay];

    [self createControls];  
    } 

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return largeImageView;
}

- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player 
{
    interrupted = audioPlayer.playing;
}

- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player 
{
    if (interrupted)
    audioPlayer.play;
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 
               successfully:(BOOL)flag 
{
    [self resetControls];
}




-(void)viewWillDisappear:(BOOL)animated {
    audioPlayer.stop;
    [super viewWillDisappear: animated];    

}

- (void)dealloc {

    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [scrubber release];
    [volume release];
    [audioPlayer release];

    [super dealloc];
}

@end

推荐答案

您使用以下语法在Objective-c中调用方法.

You call methods in objective-c using the following syntax.

[audioPlayer stop];

audioPlayer.stop将不起作用.

其他地方也一样.

这篇关于为什么切换视图时AVAudioPlayer的stop方法不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆