6

How can I display an AirPlay popup menu in my Swift project? (Many applications like Spotify can display one like below):

enter image description here

adamsfamily
  • 1,746
  • 19
  • 37
  • Look at adding a 'MPVolumeView' to your app. You don't actually create the menu but by having that control it will allow the user to see that menu when they click on it. – totiDev Jul 03 '17 at 06:52

2 Answers2

10

After all it seems there is no easy and straightforward way to make a custom button display the system's Airplay menu.

However, @totiG pointer me to an interesting resource and I created a script that creates the standard Volume Control outside of the visible area of the screen a simulates a click on the Airplay button:

func showAirplay() {
    let rect = CGRect(x: -100, y: 0, width: 0, height: 0)
    let airplayVolume = MPVolumeView(frame: rect)
    airplayVolume.showsVolumeSlider = false
    self.view.addSubview(airplayVolume)
    for view: UIView in airplayVolume.subviews {
        if let button = view as? UIButton {
            button.sendActions(for: .touchUpInside)
            break
        }
    }
    airplayVolume.removeFromSuperview()
}

After running this code the following popup menu appears:

enter image description here

adamsfamily
  • 1,746
  • 19
  • 37
4

Here's a sweet little workaround to having to use the MPVolumeView's button.

  1. Create a MPVolumeView, and hide it somewhere in the view hierarchy.
  2. Whenever you want to display the picker:

[[UIApplication sharedApplication] sendAction:NSSelectorFromString(@"_displayAudioRoutePicker") to:myVolumeView from:myView forEvent:nil];

Optional 3: On iPad you'll need to pass a UIEvent otherwise the popover will just be entered at the top of the screen and it'll look wonky. Capture the event from - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; and pass it into our call.

donkey
  • 1,343
  • 13
  • 32
  • I know this is a bit late, but is this a private API? (Will my app be accepted to the app store if I use this?) – Minebomber Sep 04 '17 at 14:24