MPMoviePlayerController добавление UIButton для просмотра, которое исчезает с помощью элементов управления - PullRequest
3 голосов
/ 24 мая 2011

Я пытаюсь добавить UIButton к представлению MPMoviePlayerController вместе со стандартными элементами управления.Кнопка появляется над видео и работает, как и ожидалось, при получении событий касания, но я бы хотел, чтобы она появлялась и исчезала со стандартными элементами управления в ответ на прикосновения пользователя.

Я знаю, что могу добиться этого, свернув мойсобственные пользовательские элементы управления плеером, но это кажется глупым, поскольку я просто пытаюсь добавить одну кнопку.

РЕДАКТИРОВАТЬ

Если вы рекурсивно пересекаете видИерархия представления MPMoviePlayerController в конечном итоге вы попадете в класс представления, называемый MPInlineVideoOverlay .Вы можете легко добавить любые дополнительные элементы управления в это представление, чтобы добиться автоматического включения / выключения.

Есть несколько ошибок, хотя иногда это может занять некоторое время (в моем опыте до секунды) после того, как высоздал MPMoviePlayerController и добавил его в представление до того, как он полностью инициализировался и создал его MPInlineVideoOverlay слой.Из-за этого мне пришлось создать переменную экземпляра с именем controlView в приведенном ниже коде, потому что иногда он не существует, когда этот код выполняется.Вот почему у меня есть последний бит кода, где функция снова вызывает себя через 0,1 секунды, если она не найдена.Я не мог заметить задержку появления кнопки на моем интерфейсе, несмотря на эту задержку.

-(void)setupAdditionalControls {
    //Call after you have initialized your MPMoviePlayerController (probably viewDidLoad)
    controlView = nil;
    [self recursiveViewTraversal:movie.view counter:0];

    //check to see if we found it, if we didn't we need to do it again in 0.1 seconds
    if(controlView) {
            UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
            [controlView addSubview:backButton];
    } else {
            [self performSelector:@selector(setupAdditionalControls) withObject:nil afterDelay:0.1];
    }
}


-(void)recursiveViewTraversal:(UIView*)view counter:(int)counter {
    NSLog(@"Depth %d - %@", counter, view); //For debug
    if([view isKindOfClass:NSClassFromString(@"MPInlineVideoOverlay")]) {
            //Add any additional controls you want to have fade with the standard controls here
            controlView = view;
    } else {
            for(UIView *child in [view subviews]) {
                    [self recursiveViewTraversal:child counter:counter+1];
            }
    }
}

Это не лучшее решение, но я публикую его на тот случай, если кто-то другой пытается сделать то же самое.вещь.Если бы Apple изменила структуру представления или имена классов, внутренние по отношению к оверлею управления, это сломалось бы.Я также предполагаю, что вы не воспроизводите видео в полноэкранном режиме (хотя вы можете воспроизводить его в полноэкранном режиме с использованием встроенных элементов управления).Мне также пришлось отключить полноэкранную кнопку, используя описанную здесь методику, поскольку представление MPInlineVideoOverlay удаляется и освобождается при его нажатии: iPad MPMoviePlayerController - отключение полноэкранного режима

Вызов setupAdditionalControls при получении описанных выше полноэкранных уведомлений повторно добавит ваши дополнительные элементы управления в пользовательский интерфейс.

Хотелось бы более элегантное решение, если кто-то может предложить что-то кроме этой хакерской атаки, к которой я пришелс.

1 Ответ

5 голосов
/ 25 мая 2011

Мое решение той же проблемы было:

  • Добавить кнопку как дочерний элемент для MPMoviePlayerController представления;
  • постепенное исчезновение кнопки, используя анимацию ее свойства alpha, с правильной продолжительностью;
  • обрабатывает touchesBegan контроллера игрока и использует его для переключения видимости кнопки (используя ее альфа);
  • используйте таймер, чтобы определить, когда снова скрыть кнопку.

Методом проб и ошибок я определил, что длительности, которые соответствуют (текущим) iOS, равны:

  • постепенно: 0,1 с
  • затухание: 0,2 с
  • длительность на экране: 5,0 с (увеличивайте это при каждом касании вида)

Конечно, это все еще хрупко; если встроенные задержки изменятся, мой будет выглядеть неправильно, но код все равно будет работать.

...