feature: segments control
This commit is contained in:
@ -35,7 +35,7 @@ namespace Pixiview.iOS.Renderers
|
||||
if (renderer.ViewController is UITabBarController controller)
|
||||
{
|
||||
var tabBar = controller.TabBar;
|
||||
tabBar.TintColor = UIColor.SecondaryLabelColor.ColorWithAlpha(1);
|
||||
tabBar.TintColor = UIColor.LabelColor;
|
||||
tabBar.UnselectedItemTintColor = UIColor.SecondaryLabelColor;
|
||||
}
|
||||
}
|
||||
|
155
Pixiview.iOS/Renderers/SegmentedControlRenderer.cs
Normal file
155
Pixiview.iOS/Renderers/SegmentedControlRenderer.cs
Normal file
@ -0,0 +1,155 @@
|
||||
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 = "<Pending>")]
|
||||
public class SegmentedControlRenderer : ViewRenderer<SegmentedControl, UISegmentedControl>
|
||||
{
|
||||
private UISegmentedControl nativeControl;
|
||||
|
||||
protected override void OnElementChanged(ElementChangedEventArgs<SegmentedControl> 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();
|
||||
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.QuaternaryLabelColor;
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user