File: Handlers\Image\ImageHandler.iOS.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using System.Threading.Tasks;
using UIKit;
 
namespace Microsoft.Maui.Handlers
{
	public partial class ImageHandler : ViewHandler<IImage, UIImageView>
	{
		protected override UIImageView CreatePlatformView() => new MauiImageView(this);
 
		protected override void DisconnectHandler(UIImageView platformView)
		{
			base.DisconnectHandler(platformView);
 
			SourceLoader.Reset();
		}
 
		public override bool NeedsContainer =>
			VirtualView?.Background != null ||
			base.NeedsContainer;
 
		public static void MapBackground(IImageHandler handler, IImage image)
		{
			handler.UpdateValue(nameof(IViewHandler.ContainerView));
 
			handler.ToPlatform().UpdateBackground(image);
		}
 
		public static void MapAspect(IImageHandler handler, IImage image) =>
			handler.PlatformView?.UpdateAspect(image);
 
		public static void MapIsAnimationPlaying(IImageHandler handler, IImage image) =>
			handler.PlatformView?.UpdateIsAnimationPlaying(image);
 
		public static void MapSource(IImageHandler handler, IImage image) =>
			MapSourceAsync(handler, image).FireAndForget(handler);
 
		public static async Task MapSourceAsync(IImageHandler handler, IImage image) =>
			await handler.SourceLoader.UpdateImageSourceAsync();
 
		public void OnWindowChanged()
		{
			if (SourceLoader.SourceManager.RequiresReload(PlatformView))
				UpdateValue(nameof(IImage.Source));
		}
 
		partial class ImageImageSourcePartSetter
		{
			public override void SetImageSource(UIImage? platformImage)
			{
				if (Handler?.PlatformView is not UIImageView imageView)
					return;
 
				if (platformImage?.Images is not null)
				{
					imageView.Image = platformImage.Images[0];
 
					imageView.AnimationImages = platformImage.Images;
					imageView.AnimationDuration = platformImage.Duration;
				}
				else
				{
					imageView.AnimationImages = null;
					imageView.AnimationDuration = 0.0;
 
					imageView.Image = platformImage;
				}
 
				Handler?.UpdateValue(nameof(IImage.IsAnimationPlaying));
 
				if (Handler?.VirtualView is IImage image && image.Source is IStreamImageSource)
					imageView.InvalidateMeasure(image);
			}
		}
	}
}