File: Handlers\Slider\SliderHandler.iOS.cs
Web Access
Project: src\src\Core\src\Core.csproj (Microsoft.Maui)
using System;
using ObjCRuntime;
using UIKit;
 
namespace Microsoft.Maui.Handlers
{
	public partial class SliderHandler : ViewHandler<ISlider, UISlider>
	{
		readonly SliderProxy _proxy = new();
 
		protected override UISlider CreatePlatformView()
		{
			var platformSlider = new UISlider { Continuous = true };
 
			if (OperatingSystem.IsMacCatalystVersionAtLeast(15) && platformSlider.TraitCollection.UserInterfaceIdiom == UIUserInterfaceIdiom.Mac)
				platformSlider.PreferredBehavioralStyle = UIBehavioralStyle.Pad;
 
			return platformSlider;
		}
 
		protected override void ConnectHandler(UISlider platformView)
		{
			base.ConnectHandler(platformView);
			_proxy.Connect(VirtualView, platformView);
		}
 
		protected override void DisconnectHandler(UISlider platformView)
		{
			base.DisconnectHandler(platformView);
			_proxy.Disconnect(platformView);
		}
 
		public static void MapMinimum(ISliderHandler handler, ISlider slider)
		{
			handler.PlatformView?.UpdateMinimum(slider);
		}
 
		public static void MapMaximum(ISliderHandler handler, ISlider slider)
		{
			handler.PlatformView?.UpdateMaximum(slider);
		}
 
		public static void MapValue(ISliderHandler handler, ISlider slider)
		{
			handler.PlatformView?.UpdateValue(slider);
		}
 
		public static void MapMinimumTrackColor(ISliderHandler handler, ISlider slider)
		{
			handler.PlatformView?.UpdateMinimumTrackColor(slider);
		}
 
		public static void MapMaximumTrackColor(ISliderHandler handler, ISlider slider)
		{
			handler.PlatformView?.UpdateMaximumTrackColor(slider);
		}
 
		public static void MapThumbColor(ISliderHandler handler, ISlider slider)
		{
			handler.PlatformView?.UpdateThumbColor(slider);
		}
 
		public static void MapThumbImageSource(ISliderHandler handler, ISlider slider)
		{
			var provider = handler.GetRequiredService<IImageSourceServiceProvider>();
 
			handler.PlatformView?.UpdateThumbImageSourceAsync(slider, provider)
				.FireAndForget(handler);
		}
 
		class SliderProxy
		{
			WeakReference<ISlider>? _virtualView;
 
			ISlider? VirtualView => _virtualView is not null && _virtualView.TryGetTarget(out var v) ? v : null;
 
			public void Connect(ISlider virtualView, UISlider platformView)
			{
				_virtualView = new(virtualView);
				platformView.ValueChanged += OnControlValueChanged;
				platformView.AddTarget(OnTouchDownControlEvent, UIControlEvent.TouchDown);
				platformView.AddTarget(OnTouchUpControlEvent, UIControlEvent.TouchUpInside | UIControlEvent.TouchUpOutside);
			}
 
			public void Disconnect(UISlider platformView)
			{
				platformView.ValueChanged -= OnControlValueChanged;
				platformView.RemoveTarget(OnTouchDownControlEvent, UIControlEvent.TouchDown);
				platformView.RemoveTarget(OnTouchUpControlEvent, UIControlEvent.TouchUpInside | UIControlEvent.TouchUpOutside);
			}
 
			void OnControlValueChanged(object? sender, EventArgs eventArgs)
			{
				if (VirtualView is ISlider virtualView && sender is UISlider platformView)
					virtualView.Value = platformView.Value;
			}
 
			void OnTouchDownControlEvent(object? sender, EventArgs e)
			{
				VirtualView?.DragStarted();
			}
 
			void OnTouchUpControlEvent(object? sender, EventArgs e)
			{
				VirtualView?.DragCompleted();
			}
		}
	}
}