【问题标题】:MPVolumeView AirPlay Button Not VisibleMPVolumeView AirPlay 按钮不可见
【发布时间】:2015-11-07 17:17:32
【问题描述】:

我已经开始在我的应用程序中使用MPVolumeView,但是 Air Play 按钮根本没有出现。即使我有不止一台 Air Play 设备可以将我的AVPlayer 音频发送到网络上。例如,如果从控制中心检查 Air Play,就可以看到这些。

这是我的代码:

myVolumeView = [MPVolumeView new];
[myVolumeView setShowsVolumeSlider:YES];
[myVolumeView setShowsRouteButton:YES];
myVolumeView.frame = _volumePanel.bounds;
[myVolumeView sizeToFit];
_myVolumeView.autoresizingMask = UIAutoresizingFlexibleWidth;
[_volumePanel addSubview:myVolumeView];

很简单的东西。我有一个运行一些音乐的AVPlayer,仅此而已。有趣的是,如果我从控制中心选择另一个 Air Play 设备,它会强制 Air Play 按钮出现在我的MPVolumeView 的应用程序中,但这有点小故障。

如果在 Xcode 中单击控制台上方的 Debug Hierarchy Mode 按钮,我可以在 UI 中看到 Air Play 按钮,但它的 Alpha 为 0。

【问题讨论】:

  • 您找到解决此问题的方法了吗?
  • 您的 Apple TV 是否通过以太网连接?如果是,请尝试使用 wifi。
  • 我也见过同样奇怪的事情。 AirPlay 按钮没有出现(即使我的 Apple TV 4 通过 Wifi 在线)。如果我点击控制面板中的 AirPlay 按钮,该按钮会出现,但当我隐藏 AirPlay Popover 时它会再次消失。奇怪的!会继续寻找。
  • 有同样的问题
  • 在这里发现了一个永久显示播放按钮的技巧:stackoverflow.com/a/46787632

标签: ios objective-c avplayer mpvolumeview


【解决方案1】:

这是一个完整而彻底的 hack,但它确实有效

   MPVolumeView* airplayButton = [[MPVolumeView alloc] init];

   for (UIButton *button in airplayButton.subviews)
    {
        if ([button isKindOfClass:[UIButton class]])
        {
            [button addObserver:self forKeyPath:@"alpha" options:NSKeyValueObservingOptionNew context:nil];
        }
    }

然后在观察者中

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([object isKindOfClass:[UIButton class]] && [[change valueForKey:NSKeyValueChangeNewKey] intValue] != 1)
    {
        UIButton *airplay = (UIButton *)object;
        [airplay setAlpha:1.0];
    }
}

别忘了在 dealloc 中关闭观察者

- (void)dealloc
{    
    for (UIButton *button in _airplayButton.subviews)
    {
        if ([button isKindOfClass:[UIButton class]])
        {
            [button removeObserver:self forKeyPath:@"alpha"];
            break;
        }
    }
}

【讨论】:

    【解决方案2】:

    [斯威夫特版]

    创建以下函数:

        func fixAirPlayButton() {
            guard let routeButton = airPlayButton.subviews.filter({$0 is UIButton}).first else { return }
            routeButton.addObserver(self, forKeyPath: "alpha", options: .new, context: nil)
        }
    
        override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
            guard let btnObject = object as? UIButton, let change = change else { return}
            guard let newChange = change[NSKeyValueChangeKey.newKey] as? Int, newChange != 1 else { return }
            btnObject.alpha = 1.0
        }
    
        func removeAirPlayButtonFix() {
            guard let routeButton = airPlayButton.subviews.filter({$0 is UIButton}).first else { return }
            routeButton.removeObserver(self, forKeyPath: "alpha")
        }
    

    并在需要时使用它们,例如:

        let airPlayButton = MPVolumeView(frame: .zero)
    
        override func viewDidLoad() {
            super.viewDidLoad()
            fixAirPlayButton()
        }
    
        deinit {
            removeAirPlayButtonFix()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多