using System; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using Pixiview.iOS.Renderers; using Pixiview.UI; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(SegmentedControl), typeof(SegmentedControlRenderer))] namespace Pixiview.iOS.Renderers { [SuppressMessage("Code Notifications", "XI0002:Notifies you from using newer Apple APIs when targeting an older OS version", Justification = "")] public class SegmentedControlRenderer : ViewRenderer { private UISegmentedControl nativeControl; protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); var element = Element; if (Control == null && element != null) { nativeControl = new UISegmentedControl(); for (var i = 0; i < element.Children.Count; i++) { nativeControl.InsertSegment(element.Children[i].Text, i, false); } nativeControl.Enabled = element.IsEnabled; //nativeControl.BackgroundColor = element.BackgroundColor.ToUIColor(); nativeControl.SelectedSegmentTintColor = GetTintColor(element); SetTextColor(); nativeControl.SelectedSegment = element.SelectedSegmentIndex; SetNativeControl(nativeControl); } if (e.OldElement != null) { if (nativeControl != null) { nativeControl.ValueChanged -= NativeControl_ValueChanged; } } if (e.NewElement != null) { nativeControl.ValueChanged += NativeControl_ValueChanged; } } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); var element = Element; if (nativeControl == null || element == null) { return; } switch (e.PropertyName) { case "Renderer": element.SendValueChanged(); break; //case nameof(element.BackgroundColor): // nativeControl.BackgroundColor = element.BackgroundColor.ToUIColor(); // break; case nameof(element.SelectedSegmentIndex): nativeControl.SelectedSegment = element.SelectedSegmentIndex; break; case nameof(element.TintColor): nativeControl.SelectedSegmentTintColor = GetTintColor(element); break; case nameof(element.IsEnabled): nativeControl.Enabled = element.IsEnabled; nativeControl.SelectedSegmentTintColor = GetTintColor(element); break; case nameof(element.SelectedTextColor): SetTextColor(); break; } } private void SetTextColor() { //var color = Element.SelectedTextColor; //UIColor c = color == default ? UIColor.LabelColor : color.ToUIColor(); UIColor c = UIColor.LabelColor; var attribute = new UITextAttributes { TextColor = c }; nativeControl.SetTitleTextAttributes(attribute, UIControlState.Selected); attribute = new UITextAttributes { TextColor = c.ColorWithAlpha(.6f) }; nativeControl.SetTitleTextAttributes(attribute, UIControlState.Normal); } private UIColor GetTintColor(SegmentedControl element) { if (element.IsEnabled) { //var tintColor = element.TintColor; //if (tintColor == default) //{ return UIColor.SystemGray6Color; //} //else //{ // return tintColor.ToUIColor().ColorWithAlpha(.3f); //} } else { //var disabledColor = element.DisabledColor; //if (disabledColor == default) //{ return UIColor.SecondaryLabelColor; //} //else //{ // return disabledColor.ToUIColor(); //} } } private void NativeControl_ValueChanged(object sender, EventArgs e) { Element.SelectedSegmentIndex = (int)nativeControl.SelectedSegment; } protected override void Dispose(bool disposing) { if (nativeControl != null) { nativeControl.ValueChanged -= NativeControl_ValueChanged; nativeControl.Dispose(); nativeControl = null; } base.Dispose(disposing); } } }