У меня есть доступ к скрытым полноэкранным методам для Windows и Android. Я добавил статический обработчик событий, к которому я могу получить доступ для Windows и Android, который сообщает мне, когда он переходит в полноэкранный режим и выходит из него. Я использовал это, удалил старое представление и добавил новое к текущему представлению. Это сработало для обеих платформ.
Но в IOS я не знаю, как получить доступ к какой-либо информации о полноэкранных событиях или как их перехватить. Я пробовал различные методы, чтобы выяснить, есть ли общедоступные способы узнать, когда это произойдет. Я попытался измерить границы каждого элемента, к которому у меня есть доступ. Они не меняются при активации полноэкранного режима. Я почти уверен, что это скрытый метод, который одновременно активируется и отображает полноэкранный режим. Я хочу перехватить события, если это возможно, и добавить метод, который добавляет текстовое поле поверх скрытого слоя avplayer. Или, если у кого-то есть идеи, как лучше это сделать, я был бы признателен за любой отзыв.
Вот метод в том виде, в котором он используется для отображения текстового поля поверх avplayer. Это работает до тех пор, пока вы не переключитесь в полноэкранный режим.
Код: Выделить всё
using CommunityToolkit.Maui.Core;
using CommunityToolkit.Maui.Core.Views;
using CommunityToolkit.Maui.Primitives;
using CoreFoundation;
using CoreGraphics;
using CoreMedia;
using Foundation;
using UIKit;
namespace CommunityToolkit.Maui.Extensions;
///
/// A class that provides subtitle support for a video player.
///
public partial class SubtitleExtensions : UIViewController
{
readonly HttpClient httpClient;
readonly UIViewController playerViewController;
readonly PlatformMediaElement? player;
readonly UILabel subtitleLabel;
List cues;
NSObject? playerObserver;
///
/// The SubtitleExtensions class provides a way to display subtitles on a video player.
///
///
///
public SubtitleExtensions(PlatformMediaElement? player, UIViewController? playerViewController)
{
ArgumentNullException.ThrowIfNull(player);
ArgumentNullException.ThrowIfNull(playerViewController?.View?.Bounds);
this.playerViewController = playerViewController;
this.player = player;
cues = [];
httpClient = new HttpClient();
subtitleLabel = new UILabel
{
Frame = CalculateSubtitleFrame(playerViewController),
TextColor = UIColor.White,
TextAlignment = UITextAlignment.Center,
Font = UIFont.SystemFontOfSize(16),
Text = "",
Lines = 0,
AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleBottomMargin
};
}
///
/// Loads the subtitles from the provided URL.
///
///
public async Task LoadSubtitles(IMediaElement mediaElement)
{
string? vttContent;
try
{
vttContent = await httpClient.GetStringAsync(mediaElement.SubtitleUrl);
}
catch (Exception ex)
{
System.Diagnostics.Trace.TraceError(ex.Message);
return;
}
cues = mediaElement.SubtitleUrl switch
{
var url when url.EndsWith("srt") => SrtParser.ParseSrtContent(vttContent),
var url when url.EndsWith("vtt") => VttParser.ParseVttContent(vttContent),
_ => throw new NotSupportedException("Unsupported subtitle format"),
};
}
///
/// Starts the subtitle display.
///
public void StartSubtitleDisplay()
{
DispatchQueue.MainQueue.DispatchAsync(() => playerViewController.View?.AddSubview(subtitleLabel));
playerObserver = player?.AddPeriodicTimeObserver(CMTime.FromSeconds(1, 1), null, (time) =>
{
TimeSpan currentPlaybackTime = TimeSpan.FromSeconds(time.Seconds);
ArgumentNullException.ThrowIfNull(subtitleLabel);
subtitleLabel.Frame = CalculateSubtitleFrame(playerViewController);
DispatchQueue.MainQueue.DispatchAsync(() => UpdateSubtitle(currentPlaybackTime));
});
}
///
/// Stops the subtitle display.
///
public void StopSubtitleDisplay()
{
ArgumentNullException.ThrowIfNull(player);
if (playerObserver is not null)
{
player.RemoveTimeObserver(playerObserver);
playerObserver.Dispose();
playerObserver = null;
subtitleLabel.RemoveFromSuperview();
}
}
void UpdateSubtitle(TimeSpan currentPlaybackTime)
{
ArgumentNullException.ThrowIfNull(subtitleLabel);
ArgumentNullException.ThrowIfNull(playerViewController.View);
foreach (var cue in cues)
{
if (currentPlaybackTime >= cue.StartTime && currentPlaybackTime
Подробнее здесь: [url]https://stackoverflow.com/questions/78449588/maui-ios-place-overlay-on-top-of-avplayercontroller-when-in-full-screen-mode[/url]