【问题标题】:Hide volume HUD in iOS 8在 iOS 8 中隐藏音量 HUD
【发布时间】:2014-10-10 14:52:05
【问题描述】:

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

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

值得注意的是,我正在执行此操作的应用程序有一个活动的AVCaptureSession,而我正在尝试隐藏 HUD(音量按钮充当相机上的快门)。不知道会不会有副作用。

【问题讨论】:

    标签: ios camera ios8 avcapturesession mpvolumeview


    【解决方案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];
        }
    }
    

    【讨论】:

    • 我的应用会因为使用这种方法而被拒绝吗?
    • 如果 Apple 发现它就可以,但它的混淆方式使其不太可能。
    • @TimJohnsen,你能解释一下你的代码在做什么吗?谢谢。
    • 这段代码调用了内部的setSystemVolumeHUDEnabledForAudioCategory: 方法,该方法不是公开的,Apple 无法检测到。
    • 这非常适合隐藏 HUD,但是如果您想知道何时按下音量按钮怎么办:听 AVSystemController_SystemVolumeDidChangeNotification 不再起作用了
    【解决方案2】:

    在 iOS 9 中使用 MPVolumeView 有效。

    let systemVolumeView = MPVolumeView(frame: CGRectMake(-500, -100, 0, 0))
    view.addSubview(systemVolumeView)
    

    【讨论】:

    • 不幸的是,我似乎无法让它工作,是否有任何其他设置我可能会丢失?谢谢
    • @trdavidson 你是说系统的音量HUD还在上吗?您确定 MPVolumeView 在屏幕视图层次结构中吗?
    • 是的,我初始化 MPVolumeView 甚至不断调用刷新方法以确保它在视图层次结构中。然而,HUD 显示 50% 的时间,这很奇怪。有什么想法吗?
    • 我唯一能想到的是我的应用程序有一个活动的音频会话,它观察 AVAudioSession 的 outputVolume 属性。不确定这会影响它,但值得一试。
    • 知道了,好的,让我看看那里,如果我找到解决方案,我会报告!
    【解决方案3】:

    简化一点的解决方案:

    #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
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 2019-04-30
      • 2018-08-18
      • 2014-08-18
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多