私はiPadアプリケーションでMPMoviePlayerを使用してビデオプレーヤーを実装し、ボリュームコントロールに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];
}
Swift
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];
- (void) viewDidLoad
{
[super viewDidLoad];
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectZero];
[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)
}
}
あるポイントでボリュームHUDを表示する必要がある場合は、app.windowから削除してください。楽しい :-)
私が思いついた最良の解決策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];
}
これは私にとって実際に機能したものです。何らかの理由で、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)
これが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)
ビデオやコンテンツを再生せずに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)
以下のコードは、MPVolumeViewをサブビューとして追加する以外に機能します。
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(YES);
ボリュームオーバーレイを無効にするには、次の手順を実行する必要がありました。
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
Objective Cのみ、Swiftはありません。 iOS 8.1以降で動作します(以前のバージョンではテストされていません)。コンテキストなしで与えられた回答に基づいてこれを実装するのに苦労したので、これを追加します。
これは私のために働きます。
MPVolumeView *volumeView2 = [[MPVolumeView alloc] initWithFrame:CGRectMake(-28, -2, 24, 24)];
[self.view addSubview:volumeView2];
volumeView2.showsVolumeSlider = true;
volumeView2.showsRouteButton = false;
_videoPlayer.AllowsAirPlay = false;
アプリ全体でMPVolumeSettingsAlertを無効にする場合は、次の行をAppDelegateのdidFinishLaunchingWithOptionsに追加します。
self.window?.insertSubview(MPVolumeView(), at: 0)
1つのViewControllerで無効にする必要がある場合は、次の行を特定のViewControllerのviewDidLoad()に追加します。
self.view.insertSubview(MPVolumeView(), at: 0)