接受了@Erik B的答案并向他颁发赏金后,我发现还需要进行更多调整才能使其正常工作。为了方便未来在stackoverflow搜索的用户,我在这里发帖。
我遇到的问题是,按钮的内部机制会根据当前的Airplay状态分配图像。因此,在初始化时进行的任何自定义操作都不会保留,如果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;
[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"];
…
}
根据代码观察,如果苹果更改MPVolumeView
的内部视图层次结构以添加/删除/修改视图,可能会导致该按钮失效。这使得它有点脆弱,因此使用时需谨慎,或者在出现问题时考虑备选方案。我已经在生产中使用了一年,并没有遇到任何问题。如果您想看它的实际效果,请查看Ambiance中的主播放器屏幕。