I use a standard gradient overlay (done in photoshop) to make buttons look nicer in my app. I added an Airplay button, but the aesthetics are not matching.
I really want to put a gradient layer over it so it matches, but anything I can find only shows how to do this with a png, not an existing UIView. If not the gradient layer, I just need someway, any way, to change the appearance of the Apple airplay button while keeping its functionality intact.
The setup code is simple:
MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:frame];
[volumeView setShowsVolumeSlider:NO];
[bottomPanel addSubview:volumeView];
How can I get the appearance of this to match my controls?
I finally found a bluetooth headset so that I could test the button. Changing its appearance was very simple. Here's the code:
That's all there's to it.
After accepting @Erik B's answer and awarding the bounty to him, I found that there was more tweaking necessary to get it to work. I am posting here for the benefit of future SO searchers.
The problem I was seeing was that the internal mechanisms of the buttons would assign the image based on the current airplay state. Thus any customizations I made during init would not stick if the Airplay receiver went away, or the state was changed somehow. To solve this, I setup a KVO observation on the button's
alpha
key. I noticed that the button is always faded in/out which is an animation onalpha
.Then I observe the changed value of the buttons
alpha
.Don't forget to remove the observer if you destroy the button
Based on code observation, the button will break if Apple changes the internal view hierarchy of the
MPVolumeView
to add/remove/alter the views such that a different button comes up. This makes it kind of fragile, so use at your own risk, or come up with a plan b in case this happens. I have been using it for over a year in production with no issues. If you want to see it in action, check out the main player screen in AmbianceI created a custom method which works perfectly...
The above code didn't work for me (as the AirPlay button is added later). As a workaround you can a standard UIButton in your UI and trigger an AirPlay in a (hidden)
MPVolumeView
button withA side effect is that the button doesn't auto hide when only one route is available, which may or may not be desired behavior.
I think there's a better solution to this since iOS 6: Use
- (void)setRouteButtonImage:(UIImage *)image forState:(UIControlState)state;
on MPVolumeView.
See https://developer.apple.com/Library/ios/documentation/MediaPlayer/Reference/MPVolumeView_Class/index.html#//apple_ref/occ/instm/MPVolumeView/setRouteButtonImage:forState: