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

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 
     } 
    } 
} 
1

Вот решение в Свифт. Это может быть теневой, поэтому я дам вам знать, одобрит ли Apple это, когда я опубликую. Между тем, это прекрасно работает для меня:

  1. Определить MPVolumeView и дополнительный UISlider в вашем View Controller

    private let volumeView: MPVolumeView = MPVolumeView() 
    private var volumeSlider: UISlider? 
    
  2. В раскадровке, определить вид, который скрыт от пользователя (высота = 0 должен сделать трюк) и установить для него выход (назовем его hiddenView). Этот шаг только хорошо, если вы хотите, чтобы не отображались громкость HUD при изменении громкости (смотрите примечание ниже):

    @IBOutlet weak var hiddenView: UIView! 
    
  3. В viewDidLoad() или где-Init-у, который выполняется один раз, поймать 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

Версия: 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

как вы должны это использовать? –

+1

Привет @JonathanPlackett, вы можете попробовать вот так: 'self.volumeSlider.value = 1 // получить максимальный объем BTW, само собой разумеется экземпляр экземпляра MPVolumeView. Надеюсь на помощь. – Jerome

2

@udjat «s ответ на 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() 
     } 
    } 
    } 
} 

Использование:

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

 Смежные вопросы

  • Нет связанных вопросов^_^