Ios MPVolumeView AirPlay按钮不可见
我已经开始在我的应用程序中使用Ios MPVolumeView AirPlay按钮不可见,ios,objective-c,avplayer,mpvolumeview,Ios,Objective C,Avplayer,Mpvolumeview,我已经开始在我的应用程序中使用MPVolumeView,但是空气播放按钮根本没有出现。即使我有多个Air Play设备可用于在网络上将我的AVPlayer音频发送到。例如,如果从控制中心检查空气间隙,可以看到这些情况 以下是我的代码: myVolumeView = [MPVolumeView new]; [myVolumeView setShowsVolumeSlider:YES]; [myVolumeView setShowsRouteButton:YES]; myVolumeView.fra
MPVolumeView
,但是空气播放按钮根本没有出现。即使我有多个Air Play设备可用于在网络上将我的AVPlayer
音频发送到。例如,如果从控制中心检查空气间隙,可以看到这些情况
以下是我的代码:
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中单击控制台上方的调试层次结构模式按钮,我可以在我的UI中看到Air Play按钮,但是它的Alpha值为0。这是一个完整的、彻底的破解,但它可以工作
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;
}
}
}
[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()
}
你找到解决这个问题的方法了吗?你的苹果电视是通过以太网连接的吗?如果是的话,试试wifi。我也看到过同样奇怪的事情。AirPlay按钮不会出现(即使我的Apple TV 4通过Wifi在线)。如果我点击控制面板中的AirPlay按钮,按钮会出现,但当我隐藏AirPlay Popover时,它会再次消失。奇怪的将继续查找。具有相同问题在此处找到永久显示airplay按钮的窍门: