2015-10-16 79 views
6

我不得不改變iPad上的音量和使用此代碼:iOS 9:如何以編程方式更改音量而不顯示系統聲音欄彈出?

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

但這種變化量和顯示系統音量控制條上的iPad。 如何在不顯示音量欄的情況下更改聲音?

我知道,setVolume:已被棄用,大家都說使用MPVolumeView。如果這是解決我的問題的唯一方法,那麼如何使用MPVolumeView更改音量?我在MPVolumeView中看不到改變聲音的任何方法。
我應該用MPVolumeView與其他課程一起使用嗎?

但是最好使用MPMusicPlayerController

謝謝你的建議!

+1

你不應該以編程方式改變音量,這是'setVolume:'被棄用的整點。你的應用可能會被拒絕。 –

回答

10

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 
    } 
} 
+0

這項工作?我試圖使用它沒有太大的成功!我添加了一個視圖並將其分類到MPVolumeView,但它似乎不工作。 – Gugulethu

+0

爲我工作!謝謝! – Jerome

+1

這是非常有用的 – Fluidity

3

我不認爲有沒有任何方法來改變音量,而不閃爍音量控制。您應該使用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]; 
+0

這適用於我在iOS8上,但不適用於iOS9。有沒有iOS9解決方法? – frakman1

1

斯威夫特> 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 
     } 
    } 
} 
1

這是Swift中的解決方案。這可能是一個陰暗的,所以我會讓你知道,如果蘋果在我發佈時批准這一點。同時,這部作品對我蠻好:

  1. 在您的視圖控制器

    private let volumeView: MPVolumeView = MPVolumeView() 
    private var volumeSlider: UISlider? 
    
  2. 定義一個MPVolumeView和可選UISlider在故事板,確定這是一個從用戶(高度隱藏在視圖= 0應該做的伎倆),併爲它設置一個插座(我們將它稱爲hiddenView在這裏)。如果你只要不改變音量時顯示音量HUD這一步是唯一的好(參見下面的註釋):

    @IBOutlet weak var hiddenView: UIView! 
    
  3. 在viewDidLoad中()或某處運行一次NIT-Y,趕上UISlider實際控制音量到可選UISlider步驟(1):

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        ... 
    
        hiddenView.addSubview(volumeView) 
        for view in volumeView.subviews { 
         if let vs = view as? UISlider { 
          volumeSlider = vs 
          break 
         } 
        } 
    } 
    
  4. 當你要設置的音量在你的代碼,只需設置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。

2

版本:斯威夫特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 
    } 
} 
+0

你應該如何使用它? –

+1

嗨@JonathanPlackett,你可以嘗試這樣: 'self.volumeSlider.value = 1 //獲得最大音量' 順便說一句,自我意味着MPVolumeView實例。希望得到幫助。 – Jerome

2

@udjat的答案斯威夫特3

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 
    } 
} 
1
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) 
相關問題