@Erik Bの回答を受け入れ、彼に賞金を授与した後、それを機能させるためにさらに調整が必要であることがわかりました。私は将来の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)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を考えてください。私はそれを1年以上本番環境で問題なく使用しています。実際の動作を確認したい場合は、Ambianceのメインプレーヤー画面を確認してください