MPVolumeView的AirPlay按钮不可见。

8
我已经开始在我的应用程序中使用MPVolumeView,但是Air Play按钮根本不会出现。即使我有多个可用于在网络上将我的AVPlayer音频发送到的Air Play设备。例如,如果从控制中心检查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 设备,它会强制在我的 MPVolumeView 应用程序中出现 Air Play 按钮,但它有点故障。
如果我在 Xcode 中点击控制台上方的 Debug Hierarchy Mode 按钮,我可以看到我的 UI 中的 Air Play 按钮,但是它的 Alpha 值为 0。

你已经找到这个问题的解决方案了吗? - BCBlanka
你的Apple TV是否连接了以太网?如果是,尝试使用wifi。 - Joshua C. Lerner
我也遇到了同样奇怪的问题。AirPlay按钮没有出现(即使我的Apple TV 4通过Wifi在线)。如果我在控制面板中点击AirPlay按钮,按钮会出现,但当我隐藏AirPlay弹出窗口时,它又消失了。很奇怪!我会继续寻找解决方法。 - bio
出现了相同的问题。 - Jake
在这里找到了一个技巧,可以永久显示AirPlay按钮:https://stackoverflow.com/a/46787632 - raphael
2个回答

2

虽然这是一种完全的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;
        }
    }
}

0

[Swift版本]

创建以下函数:

    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()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接