iPhone iOS7系统声音(铃声和提醒)音量控制

标签 iphone ios7 volume audio

这个问题似乎被多次询问和回答,但没有具体或准确的答案。因此我将针对iOS7重新构建问题并希望得到一些帮助。

我需要使用 AudioServicesPlaySystemSound 来播放声音,因为计时至关重要,这是以可变计时准确播放同时声音效果的唯一方法(尝试所有其他选项)。

效果很好,但我想调整音量。它似乎能够做到这一点的唯一方法是使用按钮,尽管有些人说使用 MPVolumeView (仅适用于音乐),有些人说使用 MPMusicPlayerController (但这也仅适用于音乐,现在已被弃用),而其他人只是说它无法完成 - 这看起来更有可能。

但是,在 iOS7 中,“设置”>“声音”中有一个滑动控件来控制铃声警报音量。有什么方法可以子类化、复制或访问此滑动控件以从应用程序内更改此音量?

最佳答案

Apple 建议使用 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)。

关于iPhone iOS7系统声音(铃声和提醒)音量控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347877/

相关文章:

visual-c++ - 使用串行设备控制应用程序卷

iphone - 如何检测 Iphone/Ipod 音量?

ios - 快速检测应用程序是在后台还是在前台

iphone - iOS 中的色轮或颜色选择器

ios7 - 无法在新的 XCode6.1 中运行 iPhone 5s 模拟器

ios - 在 Objective-C 中启动在 iPhone 4 和 5 上工作但在 iPhone 6 和 6 plus 上工作的图像

ios - Xcode 检测 iOS 版本并相应地显示 Storyboard

volume - Docker Volumes - 自动添加文件

iphone - 当 iOS 设备旋转时,如何仅更改一个元素的方向?

iphone - 架构 armv6 的 undefined symbol