Я пытаюсь добавить 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 при получении описанных выше полноэкранных уведомлений повторно добавит ваши дополнительные элементы управления в пользовательский интерфейс.
Хотелось бы более элегантное решение, если кто-то может предложить что-то кроме этой хакерской атаки, к которой я пришелс.