我正在使用MPMoviePlayerController开发支持AirPlay的iPhone应用程序。但是,我需要在自定义视图中显示此AirPlay按钮。所以,我拿了MPVolumeView并将其添加到我的自定义视图中;删除了除AirPlay按钮之外的所有MPVolumeView子视图。
问题是: 1)我可以更改“体积”视图的框架,使其适合我的自定义视图的角落以及AirPlay按钮的大小吗?我知道有可能以编程方式处理这个问题;这样做有效吗?链接Customize the Airplay button's appearance提到我们不应该改变AirPlay按钮的形状和位置。
2)我需要将自定义图像设置为AirPlay按钮,以便在美学上与我的自定义视图匹配。我该怎么做?
3)每当装有AirPlay的设备不存在时,AirPlay按钮就会从MPVolumeView中消失。 按钮消失时是否有可用的通知?当AirPlay按钮不存在时,我需要调整我的自定义视图 有没有方法来确定AirPlay按钮是否存在? MPVolumeView子视图数组具有此按钮,即使它未显示在MPVolumeView中,它也不处于隐藏状态。
谢谢和问候, 迪帕
答案 0 :(得分:5)
你应该看看这个答案:Customize the Airplay button's appearance
它与我的答案基本相同,但更详细。我认为它回答了你的大部分问题。
为方便起见,将其粘贴在这里:
在接受了@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];
然后我观察按钮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)];
}
}
如果销毁按钮
,请不要忘记删除观察者- (void)dealloc {
[self.airplayButton removeObserver:self forKeyPath:@"alpha"];
…
}
根据代码观察,如果Apple更改MPVolumeView
的内部视图层次结构以添加/删除/更改视图以便显示不同的按钮,则该按钮将中断。这使它变得脆弱,因此请自担风险,或者在发生这种情况时提出计划b。我一直在使用它超过一年的生产没有问题。如果您想查看它的实际效果,请查看Ambiance
答案 1 :(得分:0)
通过将MPVolumeView添加到UIBarButtonItem,我做得更简单
- (void) initAirPlayPicker {
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(0,0,44,44)];
volumeView.tintColor = [UIColor blueColor];
volumeView.backgroundColor = [UIColor clearColor];
UIImage *imgAirPlay = nil;
for( UIView *wnd in volumeView.subviews ) {
if( [wnd isKindOfClass:[UIButton class] ]) {
self.airPlayWindow = (UIButton*) wnd;
UIImage *img = _airPlayWindow.currentImage;
imgAirPlay = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[volumeView setRouteButtonImage: imgAirPlay forState:UIControlStateNormal];
break;
}
}
volumeView.showsRouteButton = YES;
volumeView.showsVolumeSlider = NO;
[volumeView sizeToFit];
self.airPlayButton = [[UIBarButtonItem alloc] initWithCustomView:volumeView];
}
通过将MPVolumeView添加到视图层次结构,它可以获取有关Airplay状态的通知并正常工作。