我最近将我的 VoIP 应用程序迁移到了 iOS7,但仍然存在一个我无法理解的开放错误。
在 VoIP 通话中,在 iOS6 中,您可以按物理音量按钮将音量降低到零。
现在,在iOS7中,我只能将声音降低到零之前的最后一步,这意味着音量不能静音。
我怀疑这是 iOS7 方面的问题,因为我在 iOS6 设备上使用相同的 IPA 没有问题。
有谁知道怎么回事?
一个有点老的问题,但我还需要 Gui13 的问题/评论的解决方案:
我们没有在我们的应用程序中使用任何类型的控件,所有音量交互都基于音量按钮。所以我也许可以实现这个,但我需要一种方法将它与音量按钮联系起来。这可能吗?
苹果推荐使用MPVolumeView
,所以我想出了这个:
MPVolumeView *volumeView = [MPVolumeView new];
[self.view addSubview:volumeView];
接着:
__block UISlider *volumeSlider = nil;
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UISlider class]]) {
volumeSlider = obj;
*stop = YES;
}
}];
[volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
和:
- (void)handleVolumeChanged:(id)sender
{
NSLog(@"%s - %f", __PRETTY_FUNCTION__, ((UISlider *)sender).value);
}
上面的[MPVolumeView new]
代码MPVolumeView
没有框架,所以它在我们self.view
作为子视图添加的地方是不可见的,但重要的是必须添加它!
您还可以MPVolumeView
使用以下代码初始化:
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:self.view.frame];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
[self.view addSubview:volumeView];
这也将初始化空MPVolumeView
(即没有 RouteButton 和 VolumeSlider)。
有趣的是,UISlider
子视图(实际上是MPVolumeSlider
的子类UISlider
)仍然会在enumerateObjectsUsingBlock
上面找到。
这种方法也很有趣,因为您可以保存引用volumeSlider
并在以后使用它来从代码或自定义控件中设置音量:
初始化并添加到您的视图中:
MPVolumeView *volumeView = [MPVolumeView new];
volumeView.showsRouteButton = NO;
volumeView.showsVolumeSlider = NO;
[self.view addSubview:volumeView];
查找并保存参考UISlider
:
__weak __typeof(self)weakSelf = self;
[[volumeView subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[UISlider class]]) {
__strong __typeof(weakSelf)strongSelf = weakSelf;
strongSelf.volumeSlider = obj;
*stop = YES;
}
}];
添加目标操作UIControlEventValueChanged
:
[self.volumeSlider addTarget:self action:@selector(handleVolumeChanged:) forControlEvents:UIControlEventValueChanged];
然后在音量更改时更新您的自定义控件(即通过硬件音量控件):
- (void)handleVolumeChanged:(id)sender
{
NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value);
self.myCustomVolumeSliderView.value = self.volumeSlider.value;
}
并且:
- (IBAction)myCustomVolumeSliderViewValueChanged:(id)sender {
NSLog(@"set volume to: %f", self.myCustomVolumeSliderView.value);
self.volumeSlider.value = self.myCustomVolumeSliderView.value;
}
希望这对某人有所帮助(并且 Apple 不会从 MPVolumeView 中删除 MPVolumeSlider)。
您必须使用 applicationMusicPlayer 而不是 iPodMusicPlayer 来设置系统音量:
#import <MediaPlayer/MediaPlayer.h>
musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
musicPlayer.volume = 1; // max volume
musicPlayer.volume = 0; // min volume (mute)
musicPlayer.volume = 0.0625; // 1 bar on the overlay volume display
Apple 假设他们知道需要管理卷的每一种方式。
事实上,有时我们想要改变音量的控制方式,而不是强迫用户在屏幕上使用音量滑块(立即想到闹钟和媒体播放器)。友可以参考
我的 VoIP 应用程序也有同样的问题...
我的解决方案:一切设置好后,将类别设置为播放,
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
然后将其设置回PlayAndRecord,
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
这对我有用,希望这可以帮助遇到同样问题的人。