【问题标题】:Change view before playing sound in Objective-C在 Objective-C 中播放声音之前更改视图
【发布时间】:2011-06-20 03:11:59
【问题描述】:

我有一个播放两种声音的程序。我希望用户知道正在播放哪种声音,所以我有两个大按钮图像。我想在三种不同的视图之间交换 - 一种是两个按钮都是红色的(没有播放),另一种是两个按钮之一是绿色的(显示哪个正在播放)。

我遇到的主要问题是我的声音在视图交换之前播放并结束! (我在播放声音之前使用 [window setContentView:firstSound])

更改后的视图最终会显示出来,但只有在播放 wav 的方法完成之后。

我正在使用 NSSound 播放声音文件(它们都是短 wav 文件,所以我认为它合适)

有人知道我做错了什么吗?或者如果有另一种方法我可以做到这一点?谢谢大家!!

编辑:我已按照建议进行更改,以便仅更改图像(而不是视图),但会出现同样的问题。声音播放完毕后更新。

代码如下:

-(void)readWavs{

//[window setContentView:firstWav];

[redButton setHidden:YES];

NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"fish" ofType:@"wav"];
NSSound *sound = [[NSSound alloc] initWithContentsOfFile:resourcePath byReference:YES];
[sound play];
sleep(3); //needed so that the sound will actually play
[sound stop];
[sound release];


//[redButton setHidden:NO];
//[window setContentView:testView];

sleep(2);

//[window setContentView:secondWav];

NSString *resourcePath2 = [[NSBundle mainBundle] pathForResource:@"fish" ofType:@"wav"];
NSSound *sound2 = [[NSSound alloc] initWithContentsOfFile:resourcePath2 byReference:YES];
[sound2 play];
sleep(3);
[sound2 stop];
[sound2 release];

}

绿色的“开启”按钮应该在声音播放之前出现,但只有在方法完成后才会出现。

【问题讨论】:

  • 发布播放声音和交换视图的代码可能会有所帮助。
  • 当然 :) 我现在已经更新了。

标签: objective-c view audio wav


【解决方案1】:

我不确定我的理解是否正确,但是当播放显示正在播放的声音(通过图像)时,您试图切换到完全不同的视图听起来是什么?如果是这样,您应该只使用 imageView.hidden = YES 和 imageView.hidden = NO 根据声音显示正确的图像。更好的是,您可以使用一个图像视图并根据声音更改图像视图中显示的图像。

【讨论】:

  • 哈哈,这将是一个非常合乎逻辑的方法! xD 我现在就试试 :)
  • 嘿嘿,还是一样的问题。我现在只是将我的代码放在原始帖子中。
【解决方案2】:

你用那些sleep()s 阻塞了运行循环。直到当前事件的所有处理完成后才会更新显示,并且直到这个 readWavs 方法完成后才会更新。

如果您想在声音结束后做某事,请为其分配一个委托(可能与启动声音的对象相同)并实现NSSoundDelegate-sound:didFinishPlaying: 方法。然后,在readWavs 中,只需启动声音并返回 - 你的委托方法将在它完成时被调用,并且因为readWavs 立即返回,它不会阻塞运行循环。

【讨论】:

  • 如果我想让它发生在声音播放之前和期间,而不是之后呢? (此外,我认为睡眠是狡猾的 - 但如果我不这样做,声音就会相互碰撞)
  • 但是你确实想在一个声音结束后做一些事情——开始下一个声音。这才是重点;您使用运行循环在每个声音完成时收到通知,而不是用sleep() 阻止它。隐藏红色按钮,然后启动第一个声音。当你得到那个-sound:didFinishPlaying: 时,显示红色按钮并开始第二个声音。等等……
  • 嘿 - 我已经按照你的建议做了,它确实有效(声音现在正在播放完整长度)但我仍然遇到图像问题。它通常只进行一次更改,然后再也不会更改。我已经 readWavs 调用 playSound1 -> 播放声音,隐藏红色并设置委托。然后委托调用playSound2,它显示前一个红色按钮并隐藏另一个(但这不起作用)。有什么建议吗?
  • 你记得[sound2 setDelegate:self]吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多