3

在 iOS 8 之前的版本中,隐藏系统音量覆盖有一个简单的技巧。您只需创建一个MPVolumeView并将其嵌入到您的视图层次结构中的某个地方。这在https://stackoverflow.com/a/7888977/3943258和许多其他 Stack Overflow 响应中都有记录。

但是,我发现这个技巧在 iOS 8 中似乎不起作用。我正在努力想办法解决它。有人知道在 iOS 8 中是否有办法做到这一点?

需要注意的一点是,我正在执行此操作的应用程序在AVCaptureSession我试图隐藏 HUD 时处于活动状态(音量按钮充当相机上的快门)。不确定是否会产生一些副作用。

4

3 回答 3

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

MPVolumeView在 iOS 9 中使用作品。

let systemVolumeView = MPVolumeView(frame: CGRectMake(-500, -100, 0, 0))
view.addSubview(systemVolumeView)
于 2016-05-09T19:03:00.380 回答
-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 回答