OGeek|极客世界-中国程序员成长平台

标题: ios - 自定义 View 上的 AirPlay 按钮 - 问题 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 17:03
标题: ios - 自定义 View 上的 AirPlay 按钮 - 问题

我正在使用 MPMoviePlayerController 开发支持 AirPlay 的 iPhone 应用程序。但是,我需要在我的自定义 View 中显示这个 AirPlay 按钮。因此,我采用 MPVolumeView 并将其添加到我的自定义 View 中;从 MPVolumeView 中删除了除 AirPlay 按钮之外的所有 subview 。

问题是:

  1. 我可以更改音量 View 的框架,使其适合 AirPlay 按钮大小的自定义 View 的角落吗?我知道可以以编程方式处理这个问题;这样做是否有效?链接Customize the Airplay button's appearance提到我们不应该改变 AirPlay 按钮的形状和位置。

  2. 我需要将自定义图像设置为 AirPlay 按钮,以使其在美学上与我的自定义 View 相匹配。我该怎么做?

  3. 只要不存在带有 AirPlay 的设备,AirPlay 按钮就会从 MPVolumeView 中消失。按钮消失时是否有任何通知?当 AirPlay 按钮不存在时,我需要调整我的自定义 View 。有什么方法可以识别 AirPlay 按钮是否存在? MPVolumeView subviews 数组有这个按钮,即使在 MPVolumeView 中不显示也不处于隐藏状态。



Best Answer-推荐答案


你应该看看这个答案:Customize the Airplay button's appearance

这与我的回答基本相同,但更详细。我认为它回答了你的大部分问题。

为了您的方便,把它粘贴在这里:


在接受@Erik B 的回答并将赏金授予他之后,我发现需要进行更多调整才能使其正常工作。我在这里发帖是为了 future 的 SO 搜索者。

我看到的问题是按钮的内部机制会根据当前的播放状态分配图像。因此,如果 Airplay 接收器消失或状态以某种方式改变,我在初始化期间所做的任何自定义都不会保留。为了解决这个问题,我在按钮的 alpha 键上设置了一个 KVO 观察。我注意到按钮总是淡入/淡出,这是 alpha 上的动画。

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectZero];
[volumeView setShowsVolumeSlider:NO];
for (UIButton *button in volumeView.subviews) {
    if ([button isKindOfClass:[UIButton class]]) {
        self.airplayButton = button; // @property retain
        [self.airplayButton setImage:[UIImage imageNamed"airplay.png"] forState:UIControlStateNormal];
        [self.airplayButton setBounds:CGRectMake(0, 0, kDefaultIconSize, kDefaultIconSize)];
        [self.airplayButton addObserver:self forKeyPath"alpha" options:NSKeyValueObservingOptionNew context:nil];
    }
}
[volumeView sizeToFit];

然后我观察按钮 alpha 的变化值。

- (void)observeValueForKeyPathNSString *)keyPath ofObjectid)object changeNSDictionary *)change contextvoid *)context {
    if ([object isKindOfClass:[UIButton class]] && [[change valueForKey:NSKeyValueChangeNewKey] intValue] == 1) {
        [(UIButton *)object setImage:[UIImage imageNamed"airplay.png"] forState:UIControlStateNormal];
        [(UIButton *)object setBounds:CGRectMake(0, 0, kDefaultIconSize, kDefaultIconSize)];
    }
}

如果你销毁按钮,别忘了移除观察者

- (void)dealloc {
    [self.airplayButton removeObserver:self forKeyPath"alpha"];
    …
}

根据代码观察,如果 Apple 更改 MPVolumeView 的内部 View 层次结构以添加/删除/更改 View ,从而出现不同的按钮,则按钮将中断。这使得它有点脆弱,所以使用风险自负,或者想出一个计划 b,以防发生这种情况。我已经在生产中使用它一年多了,没有任何问题。如果您想查看它的实际效果,请查看 Ambiance 中的主播放器屏幕

关于ios - 自定义 View 上的 AirPlay 按钮 - 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5388884/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) Powered by Discuz! X3.4