自定义视图上的AirPlay按钮 - 问题

spd*_*spd 2 customization ios airplay

我正在开发一个使用MPMoviePlayerController支持AirPlay的iPhone应用程序.但是,我需要在自定义视图中显示此AirPlay按钮.所以,我拿了MPVolumeView并将其添加到我的自定义视图中; 从AirPlay按钮中删除了MPVolumeView中的所有子视图.

问题是:1)我可以更改音量视图的框架,使其适合我的自定义视图的角落与AirPlay按钮的大小?我知道有可能以编程方式处理这个问题; 这样做有效吗?自定义Airplay按钮的外观链接提到我们不应该改变AirPlay按钮的形状和位置.

2)我需要将自定义图像设置为AirPlay按钮,以便在美学上与我的自定义视图匹配.我该怎么做呢?

3)每当装有AirPlay的设备不存在时,AirPlay按钮就会从MPVolumeView中消失.按钮消失时是否有可用的通知?当AirPlay按钮不存在时,我需要调整我的自定义视图是否有任何方法可以识别是否存在AirPlay按钮?MPVolumeView子视图数组具有此按钮,即使它未显示在MPVolumeView中,它也不处于隐藏状态.

谢谢和问候,Deepa

Eri*_*k B 5

您应该看一下这个答案:自定义Airplay按钮的外观

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

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


在接受了@Erik B的回答并向他颁发奖金之后,我发现需要进行更多的调整才能让它发挥作用.我在这里发帖是为了未来搜索者的利益.

我看到的问题是按钮的内部机制将根据当前的播放状态分配图像.因此,如果Airplay接收器消失,或者状态以某种方式改变,我在init期间进行的任何自定义都不会坚持.为了解决这个问题,我在按钮的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];
Run Code Online (Sandbox Code Playgroud)

然后我观察按钮的改变值alpha.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)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)];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果销毁按钮,请不要忘记移除观察者

- (void)dealloc {
    [self.airplayButton removeObserver:self forKeyPath:@"alpha"];
    …
}
Run Code Online (Sandbox Code Playgroud)

基于代码观察,如果Apple更改内部视图层次结构MPVolumeView以添加/删除/更改视图以便显示不同的按钮,则该按钮将中断.这使它变得脆弱,因此请自担风险,或者在发生这种情况时提出计划b.我一直在使用它超过一年的生产没有问题.如果你想看到它的实际效果,请查看Ambiance中的主播放器屏幕