Кнопка MPVolumeView AirPlay не отображается

Используя MPVolumeView, я хотел создать кнопку вывода AirPlay для звука приложения.

MPVolumeView *volumeView = [ [MPVolumeView alloc] initWithFrame:CGRectMake(20, 20, 220, 20)];
    [volumeView setShowsVolumeSlider:NO];
    [volumeView setShowsRouteButton:YES];
    [volumeView sizeToFit];
    [self.view addSubview:volumeView];
    [volumeView release];

Ошибок/проблем нет, но не появляется, есть идеи?
Спасибо!


person Peter V    schedule 01.05.2013    source источник
comment
Я только что использовал ваш код, и он отлично работает. Появляется кнопка трансляции, и действие работает ... Вы добавляете это в tableView или что-то в этом роде?   -  person Tommy Devoy    schedule 01.05.2013


Ответы (3)


вместо инициализации отправьте сообщение initWithFrame:(CGRect). Вроде вид есть, просто кадр (0,0,0,0)

Вот код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    ViewController *vc = [[ViewController alloc] init];
    [vc.view setBackgroundColor:[UIColor redColor]];
    MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(20, 20, 200, 50)];
    [volumeView setShowsVolumeSlider:YES];
    [volumeView setShowsRouteButton:YES];
    [volumeView sizeToFit];
    [vc.view addSubview:volumeView];
    UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 200, 50)];
    testLabel.text = @"TESTING";
    [vc.view addSubview:testLabel];
    [self.window setRootViewController:vc];
    [self.window makeKeyAndVisible];
    [vc viewDidLoad];
    return YES;
}

Работает при тестировании на устройстве:

введите здесь описание изображения

person Siddharth Dhingra    schedule 01.05.2013
comment
Спасибо, обновил до initWithFrame:CGRectMake(20, 20, 220, 20), но все равно :/ - person Peter V; 01.05.2013
comment
Я предполагаю, что self.view является ссылкой на основной вид ViewController? И поскольку все скомпилировано без проблем, вы добавили соответствующий оператор импорта в свой заголовочный файл? - person Siddharth Dhingra; 01.05.2013
comment
да, self.view работает со всеми остальными элементами и правильно, без проблем, MediaPlayer/MediaPlayer.h импортируется. Любые идеи? - person Peter V; 01.05.2013
comment
Проверьте ответ: вы не можете использовать MPVolumeView из симулятора. - person Siddharth Dhingra; 01.05.2013

Возможно, вы размещаете VolumeView на белом фоне. Кнопка маршрута Airplay белая до того, как она используется (то есть когда она не маршрутизируется через AirPlay), поэтому, если вы поместите элемент управления на белый фон, вы не увидите его, но он будет реагировать на нажатия. Измените фон на что-то вроде красного, как показано выше, и это видно.

person Woodster    schedule 06.03.2014

Кнопка маршрута Airplay появляется, когда доступно более одного маршрута.

Уловка, которую я нашел для постоянного отображения кнопки Airplay, заключается в том, чтобы скрыть кнопку маршрута MPVolumeView, удалить пользовательское взаимодействие MPVolumeView и настроить действие кнопки маршрута с помощью оболочки UIButton.

var airplayRouteButton: UIButton?

private func airPlayButton() -> UIButton {

    let wrapperView = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
    wrapperView.setImage(YOUR_AIRPLAY_IMAGE, for: UIControlState.normal)
    wrapperView.backgroundColor = .clear
    wrapperView.addTarget(self, action: #selector(PlayerView.replaceRouteButton), for: UIControlEvents.touchUpInside)

    let volumeView = MPVolumeView(frame: wrapperView.bounds)
    volumeView.showsVolumeSlider = false
    volumeView.showsRouteButton = false
    volumeView.isUserInteractionEnabled = false

    self.airplayRouteButton = volumeView.subviews.filter { $0 is UIButton }.first as? UIButton

    wrapperView.addSubview(volumeView)

    return wrapperView
}

@objc private func replaceRouteButton() {
    airplayRouteButton?.sendActions(for: .touchUpInside)
}
person raphael    schedule 17.10.2017