Скрыть устройство Volume HUD view при настройке громкости с помощью слайдера MPVolumeView
Я реализовал видеоплеер с MPMoviePlayer в своем приложении для iPad, использовал MPVolumeView для управления громкостью. Моя проблема заключается в том, что когда я прокручиваю вид громкости, чтобы отрегулировать громкость, отображается наложение громкости устройства, как на скриншоте ниже.
Как я могу отключить этот индикатор громкости системы HUD? Мой код:
@property (weak, nonatomic) IBOutlet MPVolumeView *playbackMPVolumeView;
//Customizing controller
- (void)customizeVolumeController
{
_playbackMPVolumeView.showsRouteButton = YES;
_playbackMPVolumeView.showsVolumeSlider = YES;
[_playbackMPVolumeView setVolumeThumbImage:[UIImage imageNamed:@"volume_slider_thumb.png"] forState:UIControlStateNormal];
}
12 ответов
Свифт 3
let volumeView = MPVolumeView(frame: .zero)
view.addSubview(volumeView)
Вот решение
CGRect frame = CGRectMake(-1000, -1000, 100, 100);
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:frame];
[volumeView sizeToFit];
[self.view addSubview:volumeView];
Если вы хотите скрыть HUD на всех экранах приложений, используйте следующий универсальный код:
static let mpVolumeView = MPVolumeView()
static func setupHiddenMPVolume(_ view: UIView){
if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
mpVolumeView.alpha = 0.000001
window.addSubview(mpVolumeView)
}
}
В случае, если вам нужно показать Volume HUD, просто удалите его из app.window . Наслаждаться:-)
- (void) viewDidLoad
{
[super viewDidLoad];
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectZero];
[self.view addSubview: volumeView];
...
}
взял эту ссылку из тома уведомлений applicationMusicPlayer
Лучшее решение, которое я придумал для Swift 4
import MediaPlayer
Добавьте эти 3 строки кода
let volumeView = MPVolumeView(frame: .zero)
volumeView.clipsToBounds = true
view.addSubview(volumeView)
AppDelegate:
self.window?.insertSubview(MPVolumeView(), at: 0)
Просто добавьте эти строки, где вы делаете свой экземпляр MPVolumeView видимым. Например: если у вас есть кнопка регулировки громкости
-(void)toggle
{
self.volumeView.hidden = !self.volumeView.hidden;
[self.volumeView willMoveToSuperview:self.volumeView.superview];
[self.volumeView didMoveToSuperview];
}
Если у вас есть всегда видимый ползунок громкости (экземпляр MPVolumeView).
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.volumeView.hidden = NO;
[self.volumeView willMoveToSuperview:self.volumeView.superview];
[self.volumeView didMoveToSuperview];
}
Мне пришлось сделать следующее, чтобы отключить наложение громкости:
AppDeletage.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
// disable volume hud
CGRect rect = CGRectMake(-500, -500, 0, 0);
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:rect];
[self.window addSubview:volumeView];
return YES;
}
AppDelegate.h:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
...
@property (nonatomic, strong) MPVolumeView * volumeView;
@end
Только цель С, без Свифта. Работает с iOS 8.1+ (более ранние версии не тестировались). Добавляя это, я изо всех сил пытался реализовать это на основе данных ответов без контекста.
Вот вышеупомянутое решение в Swift. Работает со Swift 2-3.
let frame = CGRect(x: -1000, y: -1000, width: 100, height: 100)
let volumeView = MPVolumeView(frame: frame)
volumeView.sizeToFit()
self.view!.addSubview(volumeView)
Ниже код работает для меня, кроме добавления MPVolumeView в качестве подпредставления.
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(YES);
Это то, что на самом деле работает для меня, по какой-то причине, если CGRect является CGRect.zero, то если есть кнопка в левом верхнем углу, не будет работать..., так что этот работал:
let volumeView = MPVolumeView(frame: CGRect.init(x: self.view.frame.maxX, y: self.view.frame.maxY, width: 0, height: 0))
volumeView.clipsToBounds = true
volumeView.showsRouteButton = false
self.view.addSubview(volumeView)
Для всего, что просто хочет скрыть HUD без воспроизведения видео или контента, не забудьте добавить это:
try! AVAudioSession.sharedInstance().setActive(true, options: [])
try! AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: [])
Тогда эти строки будут работать:
let frame = CGRect(x: -1000, y: -1000, width: 100, height: 100)
let volumeView = MPVolumeView(frame: frame)
volumeView.sizeToFit()
self.view.addSubview(volumeView)
Если вы хотите отключить MPVolumeSettingsAlert для всего приложения, добавьте эту строку в didFinishLaunchingWithOptions в AppDelegate:
self.window?.insertSubview(MPVolumeView(), at: 0)
Если вам нужно отключить его только в одном View Controller, добавьте эту строку в viewDidLoad() определенного ViewController:
self.view.insertSubview(MPVolumeView(), at: 0)
Это работает для меня.
MPVolumeView *volumeView2 = [[MPVolumeView alloc] initWithFrame:CGRectMake(-28, -2, 24, 24)];
[self.view addSubview:volumeView2];
volumeView2.showsVolumeSlider = true;
volumeView2.showsRouteButton = false;
_videoPlayer.AllowsAirPlay = false;