这个问题似乎被问过很多次,但没有具体或准确的答案。因此,我将重新讨论iOS7的问题,并希望有所帮助。
我需要使用AudioServicesPlaySystemSound播放声音,因为定时至关重要,这是在可变定时下准确播放同时声音效果的唯一方法(尝试其他方法)。
效果很好,但我想调节音量。看来能够执行此操作的唯一方法是使用按钮,尽管有些人说使用MPVolumeView(仅适用于音乐),有些人说使用MPMusicPlayerController(但它也仅适用于音乐并且现在已贬值),而其他人只是说它无法完成-看起来更有可能。
但是,在iOS7中,“铃声”警报音量的“设置”>“声音”中有一个滑动控件。有什么方法可以继承,复制或访问此幻灯片控件,以从应用程序内部更改此音量?
最佳答案
苹果建议使用MPVolumeView
,所以我想到了这个:
添加volumeSlider
属性:
@property (nonatomic, strong) UISlider *volumeSlider;
初始化
MPVolumeView
并将其添加到您的 View 中(由于showsRouteButton = NO
和showsVolumeSlider = 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)。