这个问题似乎被问过很多次,但没有具体或准确的答案。因此,我将重新讨论iOS7的问题,并希望有所帮助。

我需要使用AudioServicesPlaySystemSound播放声音,因为定时至关重要,这是在可变定时下准确播放同时声音效果的唯一方法(尝试其他方法)。

效果很好,但我想调节音量。看来能够执行此操作的唯一方法是使用按钮,尽管有些人说使用MPVolumeView(仅适用于音乐),有些人说使用MPMusicPlayerController(但它也仅适用于音乐并且现在已贬值),而其他人只是说它无法完成-看起来更有可能。

但是,在iOS7中,“铃声”警报音量的“设置”>“声音”中有一个滑动控件。有什么方法可以继承,复制或访问此幻灯片控件,以从应用程序内部更改此音量?

最佳答案

苹果建议使用MPVolumeView,所以我想到了这个:

添加volumeSlider属性:

@property (nonatomic, strong) UISlider *volumeSlider;

初始化MPVolumeView并将其添加到您的 View 中(由于showsRouteButton = NOshowsVolumeSlider = NO,可以隐藏,无框架或为空):
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;
}

注意:确保设置self.volumeSlider.value不会循环回到设置self.myCustomVolumeSliderView.value

希望这对某人有帮助(并且Apple不会从MPVolumeView中删除MPVolumeSlider)。

10-05 20:31
查看更多