2015-10-16 10 views
6

Ben iPad'de hacmini ve bu kodu kullanarak değiştirmek zorunda. Ses seviyesi çubuğunu göstermeden ses nasıl değiştirilir?iOS 9: Sistem ses çubuğu açılır penceresini göstermeden birimi nasıl değiştirebilirim? iPad'de</p> <pre><code>[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; </code></pre> <p>Ama bu değişen hacmi ve gösteren sistem birimi bar:

Biliyorum, setVolume: kullanımdan kaldırıldı ve herkes MPVolumeView'u kullanmayı söylüyor. Sorunumu çözmenin tek yolu buysa, MPVolumeView'u kullanarak sesi nasıl değiştirebilirim? MPVolumeView'da sesi değiştiren herhangi bir yöntem göremiyorum.
MPVolumeView ile birlikte başka bir sınıf kullanmalı mıyım?

MPMusicPlayerController'un kullanılması tercih edilir.

Tavsiye ettiğiniz için teşekkür ederiz!

+1

Ses düzeyini programsal olarak değiştirmemeniz gerekir. Bu, setVolume: 'nin tüm noktasını kullanır. Uygulamanız reddedilebilir. –

cevap

10

MPVolumeView bir kaydırıcı sahiptir ve sürgünün değerini değiştirerek, cihazın ses seviyesini değiştirebilir. Kolayca kaydırıcıyı erişmek için bir MPVolumeView uzantısı yazdı:

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

Bu iş mi? Çok fazla başarı göstermeden kullanmaya çalışıyorum! Bir görünüm ekledim ve MPVolumeView alt sınıfına ekledim, ancak çalışıyor gibi görünmüyor. – Gugulethu

+0

Benim için çalış! Teşekkürler! – Jerome

+1

Bu süper yararlı oldu – Fluidity

3

Ses düzeyi denetimi yanıp sönmeden birimi değiştirmenin bir yolu olduğunu sanmıyorum. Böyle MPVolumeView kullanmalısınız:

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

Bu, iOS8'de benim için çalışıyor ancak iOS9'da çalışmıyor. IOS9 çözümü var mı? – frakman1

1

Swift> 2.2, iOS> 8.0, ben arıyordum herhangi bir çözüm bulamadık

ama çözüm olarak bunu sonuna kadar:

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'de bir çözüm var. Gölgeli olabilir, bu yüzden yayınladığımda Apple'ın bunu onaylayıp onaylamadığını size bildiririm. Bu arada, bu benim için sadece iyi çalışır:

  1. kullanıcı (yükseklik gizlendiği bir görünümü tanımlamak, storyboard olarak sizin View Controller

    private let volumeView: MPVolumeView = MPVolumeView() 
    private var volumeSlider: UISlider? 
    
  2. bir MPVolumeView ve isteğe bağlı UISlider tanımla = 0 hile yapmalı ve bunun için bir çıkış yapmalıyız (buna hiddenView buradan ulaşabilirsiniz). Eğer hacim değiştirirken hacmini HUD gösterilecek DEĞİL istiyorsanız bu adım sadece iyidir (aşağıdaki nota bakınız): yere

    @IBOutlet weak var hiddenView: UIView! 
    
  3. viewDidLoad yılında

    () veya bir defa çalışır init-y, aslında UISlider yakalamak adımdan opsiyonel UISlider içine hacmi (1) kontrol eder:? kodunuzda düzeyini ayarlamak istediğinizde, sadece volumeSlider set

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        ... 
    
        hiddenView.addSubview(volumeView) 
        for view in volumeView.subviews { 
         if let vs = view as? UISlider { 
          volumeSlider = vs 
          break 
         } 
        } 
    } 
    
  4. .value yerde örneğin 0.0 ile 1.0 arasında olmasınıSesi artırmak için:

    func someFunc() { 
        if volumeSlider?.value < 0.99 { 
         volumeSlider?.value += 0.01 
        } else { 
         volumeSlider?.value = 1.0 
        } 
    } 
    

Önemli not: görünmesini iPhone'un Cilt HUD önleyecektir Bu çözüm - kodunuzda ses düzeyini değiştirmek ya da her iki kullanıcı tıkladığında harici ses düğmeleri. HUD öğesini görüntülemek istiyorsanız, tüm gizli görüntüleme öğelerini atlayın ve MPVolumeView öğesini bir alt görünüm olarak eklemeyin. Bu, iOS'un ses seviyesi değiştiğinde HUD'yi göstermesine neden olur.

2

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

Bunu nasıl kullanmanız gerekiyor? –

+1

Merhaba @JonathanPlackett, şu şekilde deneyebilirsiniz: 'self.volumeSlider.value = 1 // en yüksek ses düzeyini al ' BTW, kendi kendine MPVolumeView örneği. Yardımın için umarım. – Jerome

2

@udjat 'cevabı Swift 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() 
     } 
    } 
    } 
} 

Kullanım:

// set volume to 50% 
viewController.setVolume(0.5) 
İlgili konular