• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 自定义 View 上的 AirPlay 按钮 - 问题

[复制链接]
菜鸟教程小白 发表于 2022-12-13 17:03:25 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap