IPadでボリュームを変更し、次のコードを使用する必要があります。
[[MPMusicPlayerController applicationMusicPlayer] setVolume:0];
しかし、この変化する音量とiPadのシステム音量バーが表示されます。 音量バーを表示せずにサウンドを変更するには?
知っている、 setVolume:
は非推奨であり、誰もがMPVolumeView
を使用するように言っています。これが私の問題を解決する唯一の方法である場合、MPVolumeView
を使用してボリュームを変更する方法は? MPVolumeView
にサウンドを変更するメソッドはありません。MPVolumeView
と一緒に別のクラスを使用する必要がありますか?
ただし、MPMusicPlayerController
を使用することをお勧めします。
アドバイスありがとうございます!
MPVolumeView
にはスライダーがあり、スライダーの値を変更することにより、デバイスの音量を変更できます。スライダーに簡単にアクセスするために、MPVolumeView
拡張を作成しました。
extension MPVolumeView {
var volumeSlider:UISlider {
self.showsRouteButton = false
self.showsVolumeSlider = false
self.hidden = true
var slider = UISlider()
for subview in self.subviews {
if subview.isKindOfClass(UISlider){
slider = subview as! UISlider
slider.continuous = false
(subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume
return slider
}
}
return slider
}
}
変更する必要があるslider.value
少し遅れて。
extension MPVolumeView {
static func setVolume(_ volume: Float) {
let volumeView = MPVolumeView()
let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
slider?.value = volume
}
}
}
使用法:
MPVolumeView.setVolume(0.5)
extension UIViewController {
func setVolumeStealthily(_ volume: Float) {
guard let view = viewIfLoaded else {
assertionFailure("The view must be loaded to set the volume with no UI")
return
}
let volumeView = MPVolumeView(frame: .zero)
guard let slider = volumeView.subviews.first(where: { $0 is UISlider }) as? UISlider else {
assertionFailure("Unable to find the slider")
return
}
volumeView.clipsToBounds = true
view.addSubview(volumeView)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak slider, weak volumeView] in
slider?.setValue(volume, animated: false)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { [weak volumeView] in
volumeView?.removeFromSuperview()
}
}
}
}
使用法:
// set volume to 50%
viewController.setVolume(0.5)
ボリュームコントロールを点滅させずにボリュームを変更する方法はないと思います。次のようにMPVolumeView
を使用する必要があります。
MPVolumeView* volumeView = [[MPVolumeView alloc] init];
// Get the Volume Slider
UISlider* volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
volumeViewSlider = (UISlider*)view;
break;
}
}
// Fake the volume setting
[volumeViewSlider setValue:1.0f animated:YES];
[volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
@udjatの答えSwift
extension MPVolumeView {
var volumeSlider: UISlider? {
showsRouteButton = false
showsVolumeSlider = false
isHidden = true
for subview in subviews where subview is UISlider {
let slider = subview as! UISlider
slider.isContinuous = false
slider.value = AVAudioSession.sharedInstance().outputVolume
return slider
}
return nil
}
}
バージョン:Swift 3&Xcode 8.1
extension MPVolumeView {
var volumeSlider:UISlider { // hacking for changing volume by programing
var slider = UISlider()
for subview in self.subviews {
if subview is UISlider {
slider = subview as! UISlider
slider.isContinuous = false
(subview as! UISlider).value = AVAudioSession.sharedInstance().outputVolume
return slider
}
}
return slider
}
}
これがSwiftのソリューションです。それは日陰のものかもしれないので、Apple私が公開時にこれを承認したかどうかをお知らせします。その間、これは私のためにうまく機能します:
View ControllerでMPVolumeViewとオプションのUISliderを定義します
private let volumeView: MPVolumeView = MPVolumeView()
private var volumeSlider: UISlider?
ストーリーボードで、ユーザーに対して非表示のビューを定義し(height = 0でトリックを行う必要があります)、そのアウトレットを設定します(ここではhiddenViewと呼びます)。この手順は、ボリュームを変更するときにボリュームHUDを表示しない場合にのみ有効です(以下の注を参照)。
@IBOutlet weak var hiddenView: UIView!
ViewDidLoad()または1回実行されるinit-yで、実際にボリュームを制御するUISliderをステップ(1)からオプションのUISliderにキャッチします。
override func viewDidLoad() {
super.viewDidLoad()
...
hiddenView.addSubview(volumeView)
for view in volumeView.subviews {
if let vs = view as? UISlider {
volumeSlider = vs
break
}
}
}
コードで音量を設定する場合は、volumeSlider?.valueを0.0〜1.0の範囲で設定します。音量を上げるには:
func someFunc() {
if volumeSlider?.value < 0.99 {
volumeSlider?.value += 0.01
} else {
volumeSlider?.value = 1.0
}
}
重要な注意:このソリューションはiPhoneのボリュームHUDが表示されないようにする-コードでボリュームを変更するとき、またはユーザーが外部ボリュームボタンをクリックするときのいずれかです。 HUDを表示する場合は、非表示のビューをすべてスキップし、MPVolumeViewをサブビューとしてまったく追加しないでください。これにより、音量が変化したときにiOSがHUDを表示します。
Swift> 2.2、iOS> 8.0、
私が探していた解決策は見つかりませんでしたが、解決策としてこれを行うことになります:
let volumeView = MPVolumeView()
override func viewDidLoad() {
...
view.addSubview(volumeView)
volumeView.alpha = 0.00001
}
func changeSpeakerSliderPanelControls(volume: Float) {
for subview in self.volumeView.subviews {
if subview.description.rangeOfString("MPVolumeSlider") != nil {
let slider = subview as! UISlider
slider.value = volume
break
}
}
}
次のコードでデフォルトのUISliderを使用できます。
import MediaPlayer
class CusomViewCOntroller: UIViewController
// could be IBOutlet
var customSlider = UISlider()
// in code
var systemSlider = UISlider()
override func viewDidLoad() {
super.viewDidLoad()
let volumeView = MPVolumeView()
if let view = volumeView.subviews.first as? UISlider{
systemSlider = view
}
}
次にコードを書くだけ
systemSlider.value = customSlide.value