Ich muss die Lautstärke auf dem iPad ändern und diesen Code verwenden:
[[MPMusicPlayerController applicationMusicPlayer] setVolume:0];
Dies ändert jedoch die Lautstärke und zeigt die Systemvolumenanzeige auf dem iPad. Wie kann ich den Sound ändern, ohne den Lautstärkebalken anzuzeigen?
Ich weiß, setVolume:
ist veraltet und jeder sagt, MPVolumeView
zu verwenden. Wenn dies die einzige Möglichkeit ist, mein Problem zu lösen, wie kann man dann die Lautstärke mit MPVolumeView
ändern? Ich sehe keine Methode in MPVolumeView
, die den Sound verändert.
Soll ich eine andere Klasse zusammen mit MPVolumeView
verwenden?
Es ist jedoch vorzuziehen, MPMusicPlayerController
zu verwenden.
Danke für deinen Rat!
MPVolumeView
verfügt über einen Schieberegler. Durch Ändern des Schiebereglers können Sie die Gerätelautstärke ändern. Ich habe eine Erweiterung von MPVolumeView
geschrieben, um einfach auf den Schieberegler zuzugreifen:
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
}
}
Sie müssen slider.value
nach einer kurzen Verzögerung ändern.
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
}
}
}
Verwendungszweck:
MPVolumeView.setVolume(0.5)
Ich glaube nicht, dass es eine Möglichkeit gibt, die Lautstärke zu ändern, ohne den Lautstärkeregler zu blinken. Sie sollten MPVolumeView
folgendermaßen verwenden:
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];
@udjats Antwort in 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
}
}
Version: 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
}
}
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()
}
}
}
}
Verwendungszweck:
// set volume to 50%
viewController.setVolume(0.5)
Hier ist eine Lösung in Swift. Es könnte ein zwielichtiges sein, also werde ich Sie wissen lassen, ob Apple dies bei der Veröffentlichung genehmigt hat. Mittlerweile funktioniert das für mich gut:
Definieren Sie in Ihrem View Controller ein MPVolumeView und einen optionalen UISlider
private let volumeView: MPVolumeView = MPVolumeView()
private var volumeSlider: UISlider?
Definieren Sie im Storyboard eine Ansicht, die für den Benutzer verborgen ist (height = 0 sollte den Trick ausführen), und legen Sie einen Auslass dafür fest (wir nennen ihn hiddenView). Dieser Schritt ist nur dann sinnvoll, wenn Sie die Lautstärkepegel NICHT anzeigen möchten, wenn Sie die Lautstärke ändern (siehe Hinweis unten):
@IBOutlet weak var hiddenView: UIView!
In viewDidLoad () oder an einem anderen Ort, an dem init-y einmal ausgeführt wird, fangen Sie den UISlider, der das Volume tatsächlich steuert, in den optionalen UISlider von Schritt (1) aus ein:
override func viewDidLoad() {
super.viewDidLoad()
...
hiddenView.addSubview(volumeView)
for view in volumeView.subviews {
if let vs = view as? UISlider {
volumeSlider = vs
break
}
}
}
Wenn Sie die Lautstärke in Ihrem Code einstellen möchten, setzen Sie den Wert für volumeSlider? .Val auf einen Wert zwischen 0,0 und 1,0, z. zur Erhöhung der Lautstärke:
func someFunc() {
if volumeSlider?.value < 0.99 {
volumeSlider?.value += 0.01
} else {
volumeSlider?.value = 1.0
}
}
Wichtiger Hinweis: Diese Lösung wird verhindert, dass das Volume HUD des iPhones erscheint - entweder wenn Sie die Lautstärke in Ihrem Code ändern oder wenn der Benutzer auf die externen Lautstärketasten klickt. Wenn Sie das HUD anzeigen möchten, überspringen Sie alle versteckten Ansichten und fügen Sie MPVolumeView keinesfalls als Unteransicht hinzu. Dies bewirkt, dass iOS das HUD anzeigt, wenn sich die Lautstärke ändert.
Swift> 2.2, iOS> 8.0,
Ich habe keine Lösung gefunden, die ich gesucht habe, aber ich mache das als Lösung:
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
}
}
}
Sie können den Standard-UISlider mit diesem Code verwenden:
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
}
}
als nächstes schreiben Sie einfach in den Code
systemSlider.value = customSlide.value