Добавить пользовательские элементы управления в MoviePlayer

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

Добавить пользовательские элементы управления в MoviePlayer

Я пытаюсь добавить что-то вроде элементов управления справа и слева от основных элементов управления фильмом.

Я сделал это в Open SDK, добавив подкласс к playerview, но теперь в официальном SDK и Apple, перейдя на MPMoviePlayerController, я не знаю, как это сделать.

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

Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
16 272
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Этот образец приложения, предоставляемый Apple, должен помочь. Из описания:

Demonstrates how to use the Media Player Framework to play a movie full-screen. The sample contains code to configure the movie background color, playback controls and scaling mode via the built-in Settings application. Also shows how to draw custom overlay controls on top of the movie during playback.

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

kdbdallas 11.10.2008 02:06
Ответ принят как подходящий

Я нашел ЛУЧШИЙ способ сделать это!

Вы создаете свой проигрыватель фильмов, как обычно, а затем делаете следующее:

id vvController = [theMovie videoViewController];
[[vvController _overlayView] addSubview:mainView];

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

Обратите внимание, что это все еще использует стандартные фреймворки, но это недокументировано в фреймворках. Таким образом, он должен быть на 100% безопасным для магазинов приложений, но "может" измениться без уведомления Apple в более поздних версиях.

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

keuminotti 03.07.2009 02:02

Вы можете создавать элементы управления, но то, что они делают, ограничивается тем, что вы можете делать с помощью SDK. Например, у меня есть элемент управления рейтингом, который я показываю, и когда он оценивается, он отправляет его на сервер. То, что вы хотите, потребует возможности сказать игроку, чтобы он переместился вперед на 1 кадр и остановился, что в настоящее время вы не можете. Если хотите, отправьте запрос функции на bugreporter.apple.com.

kdbdallas 07.07.2009 08:49

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

Nag_iphone 20.10.2011 17:37

Не имеет значения, находится ли он в «стандартной структуре», это частный метод, поэтому он не разрешен!

Erik Aigner 28.08.2012 02:26

Я понимаю, что это сработало в 2008 году, но как насчет 2013 года? У меня это не работает, поэтому я подумал, что спрошу.

Jacksonkr 12.01.2013 02:45

Это приведет к отклонению вашего приложения.

LightningStryk 16.05.2014 01:25

Люди здесь, вероятно, также видели в различных других сообщениях в блогах следующий подход к «получить окно проигрывателя фильмов» - при index = 1. Хотя этот подход (см. Фрагмент ниже) также, возможно, немного «хрупкий», он, вероятно, немного «безопаснее», поскольку нет использует любые недокументированные или закрытые методы в MPMoviePlayerController.

Также обратите внимание, что вам следует подождать, пока вы не получите MPMoviePlayerContentPreloadDidFinishNotification, чтобы окно проигрывателя фильмов (idx = 1) действительно существовало ;-)

Обратите внимание, что здесь я также назначаю произвольный (целочисленный) «тег» представления для myOverlayView - чтобы я мог повторно использовать представление, когда это возможно, т.е. проверять, добавлен ли он уже в окно родительского проигрывателя.

anyhoo, вот соответствующий фрагмент кода:

// use slight "hack" to get our (parent) movie-player window, should always (?) be the UIWindow at index = 1
//
UIWindow *moviePlayerWindow= [[[UIApplication sharedApplication] windows] objectAtIndex:1];

myOverlayView.center = CGPointMake(
                            moviePlayerWindow.bounds.size.width - (myOverlayView.bounds.size.height / 2) - myOverlayView.display_origin.y,
                            moviePlayerWindow.center.y
                                  ); // center our overlay-view

myOverlayView.hidden = NO; // and show it

if ( [moviePlayerWindow viewWithTag: MY_OVERLAY_VIEW_TAG] == nil ) {
    // haven't added our overlay-view as a sub-view to the main MoviePlayer window yet... so do that now
    myOverlayView.tag = MY_OVERLAY_VIEW_TAG;
    [moviePlayerWindow addSubview: myOverlayView];
}
[moviePlayerWindow bringSubviewToFront: myOverlayView]; // in any case, bring it to the foreground

Возможно, я неправильно интерпретирую вашу теорию, но мой пользовательский элемент управления не скрывается за остальными элементами управления плеером. Должен ли этот код допускать это?

Jacksonkr 14.01.2013 21:48

Я рекомендую VideoPlayerKit. Поддерживает потоковую передачу, полноэкранный режим, AirPlay.

https://github.com/ign/VideoPlayerKit

У меня возникли проблемы с использованием этого, в частности, с частью кода «ShareThis». Вот вопрос, который я писал раньше. stackoverflow.com/questions/17667078/…

vnchopra 24.07.2013 22:44

Я не реализовал ALMoviePlayerController, но, похоже, он дает краткое и достаточное решение вашей проблемы.

Из репозитория git:

«Подставная замена для MPMoviePlayerController, открывающая элементы пользовательского интерфейса и обеспечивающая максимальную настройку»

https://github.com/alobi/ALMoviePlayerController

Другие вопросы по теме