我想改变在iOS(iPhone)设备的音量。
我知道我可以改变与低于此线的音乐库的容量:
//implement at first MediaPlayer framework
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
musicPlayer.volume = 1;
但是,那不是我的目标。
我想改变设备的音量还是让我说铃声的音量。
我怎样才能做到这一点? 只是改变设备的音量?
要回答brush51的问题:
我怎样才能做到这一点? 只是改变设备的音量?
至于建议为0x7FFFFFFF:
你不能改变设备的音量编程,但是MPVolumeView(音量滑块)有改变设备的音量,但只能通过用户交互。
因此,苹果公司建议使用MPVolumeView
,所以我想出了这个:
添加volumeSlider
属性:
@property (nonatomic, strong) UISlider *volumeSlider;
初始化MPVolumeView
和某处添加到视图(可隐藏,而无需框架或空的,因为的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];
然后检测体积变化(由硬件音量控制IE):
- (void)handleVolumeChanged:(id)sender
{
NSLog(@"%s - %f", __PRETTY_FUNCTION__, self.volumeSlider.value);
}
而且周围的其他方式,你可以通过设置音量:
self.volumeSlider.value = < some value between 0.0f and 1.0f >;
希望这有助于(和苹果不从MPVolumeView删除MPVolumeSlider)。
下面是我做了什么:
func setSystemVolume(volume: Float) {
let volumeView = MPVolumeView()
for view in volumeView.subviews {
if (NSStringFromClass(view.classForCoder) == "MPVolumeSlider") {
let slider = view as! UISlider
slider.setValue(volume, animated: false)
}
}
}
由于物业volume
在MPMusicPlayerController
在IOS 7是弃用这是只有你能做到这一点的方法。
你必须使用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
这(SWIFT)解决方案,为我工作很大: http://weimenglee.blogspot.com/2015/07/ios-tip-programmatically-adjust-device.html
import MediaPlayer
let volumeView = MPVolumeView()
if let view = volumeView.subviews.first as? UISlider{
view.value = 0.1 //---0 t0 1.0---
}
下面是可以设置系统音量和ASLO上进行任何更改通知您(通过自己的变化响应者setTarget一个小包装类:动作:)。
编辑 :如果你隐藏MPVolumeView控制或者不将其添加为一个子视图,则系统会显示在屏幕中央的默认音量广场只要你改变音量编程。 如果你不喜欢这个系统做什么,解决的办法是设置视图坐标屏幕之外。 我下面编辑了一下我的代码,以反映这一点。
@import MediaPlayer;
@interface SysVolumeControl : MPVolumeView
@property (nonatomic) float value; // from 0 to 1.0
- (void)setTarget:(id)target action:(SEL)action;
@end
@implementation SysVolumeControl
{
UISlider* _slider;
}
- (id)init
{
if (self = [super initWithFrame:CGRectMake(-300, 0, 200, 50)])
{
for (UIView* view in self.subviews)
{
if ([view isKindOfClass:UISlider.class])
{
_slider = (UISlider*)view;
break;
}
}
}
return self;
}
- (float)value
{ return _slider.value; }
- (void)setValue:(float)value
{ _slider.value = value; }
- (void)setTarget:(id)target action:(SEL)action
{ [_slider addTarget:target action:action forControlEvents:UIControlEventValueChanged]; }
@end
然后创建一个实例,并使用它:
SysVolumeControl* sysVolumeControl = [SysVolumeControl new];
[myView addSubview:sysVolumeControl];
sysVolumeControl.value = 1.0;
[sysVolumeControl setTarget:self action:@selector(mySysVolumeResponder:)];
在飞行创建MPVolumeView获得滑块,将音量设置不在iOS的11.4工作了。 我通过添加新MPVolumeView我的UIViewController视图解决了问题,否则就没有设置音量。 正如我它添加到控制器我还需要设置是在屏幕的外部的体积视图的位置。
该代码是在夫特4:
let volumeControl = MPVolumeView(frame: CGRect(x: 0, y: 0, width: 120, height: 120))
override func viewDidLoad() {
self.view.addSubview(volumeControl);
}
override func viewDidLayoutSubviews() {
volumeControl.frame = CGRect(x: -120, y: -120, width: 100, height: 100);
}
func setMaxVolume() {
let lst = volumeControl.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}
let slider = lst.first as? UISlider
slider?.setValue(1, animated: false)
}
斯威夫特3 -我使用这个:
func setVolumeTo(volume: Float) {
(MPVolumeView().subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}.first as? UISlider)?.setValue(volume, animated: false)
}