3

iOS 8 より前のバージョンでは、システム ボリューム オーバーレイを非表示にする簡単な方法がありました。を作成しMPVolumeViewて、ビュー階層のどこかに埋め込むだけです。これは、 https://stackoverflow.com/a/7888977/3943258および他の多くの Stack Overflow 応答に記載されています。

しかし、このトリックは iOS 8 では機能しないようです。どうすれば修正できるか、頭を悩ませています。iOS 8でこれを行う方法があるかどうか誰か知っていますか?

注意すべきことの 1 つは、HUD を非表示にしようとしている間、これを行っているアプリがアクティブになっているAVCaptureSessionことです (ボリューム ボタンはカメラのシャッターとして機能します)。その副作用があるかどうかはわかりません。

4

3 に答える 3

1

使用MPVolumeViewは iOS 9 で動作します。

let systemVolumeView = MPVolumeView(frame: CGRectMake(-500, -100, 0, 0))
view.addSubview(systemVolumeView)
于 2016-05-09T19:03:00.380 に答える
1

これはプライベート API を悪用していますが、機能することがわかりました。

- (void)setVolumeHidden:(BOOL)hidden
{
    NSString *str1 = @"etSystemV";
    NSString *str2 = @"eHUDEnabled";
    NSString *selectorString = [NSString stringWithFormat:@"s%@olum%@:forAudioCategory:", str1, str2];
    SEL selector = NSSelectorFromString(selectorString);

    if ([[UIApplication sharedApplication] respondsToSelector:selector]) {
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIApplication instanceMethodSignatureForSelector:selector]];
        invocation.selector = selector;
        invocation.target = [UIApplication sharedApplication];
        BOOL value = !hidden;
        [invocation setArgument:&value atIndex:2];
        __unsafe_unretained NSString *category = @"Ringtone";
        [invocation setArgument:&category atIndex:3];
        [invocation invoke];
    }
}
于 2015-01-07T17:11:35.853 に答える
-1

少し単純化されたソリューション:

#import <UAObfuscatedString/UAObfuscatedString.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
SEL selector = NSSelectorFromString(NSMutableString.string.s.e.t.S.y.s.t.e.m.V.o.l.u.m.e.H.U.D.E.n.a.b.l.e.d.colon.f.o.r.A.u.d.i.o.C.a.t.e.g.o.r.y.colon);
if ([[UIApplication sharedApplication] respondsToSelector:selector]) {
    [[UIApplication sharedApplication] performSelector:selector withObject:@NO withObject:@"Ringtone"];
}
#pragma clang diagnostic pop
于 2016-09-27T16:10:46.243 に答える