Skip to content

Instantly share code, notes, and snippets.

@khle
Forked from davidtavarez/LineEntry.cs
Created January 2, 2017 16:16
Show Gist options
  • Save khle/ac87eafddabf3678b0cac9dfb9da1a35 to your computer and use it in GitHub Desktop.
Save khle/ac87eafddabf3678b0cac9dfb9da1a35 to your computer and use it in GitHub Desktop.
Xamarin.Forms Entry just with bottom border.
using Xamarin.Forms;
namespace YOUTNAMESPACE
{
public class LineEntry : Entry
{
public static readonly BindableProperty BorderColorProperty =
BindableProperty.Create<LineEntry, Color> (p => p.BorderColor, Color.Black);
public Color BorderColor {
get { return (Color)GetValue (BorderColorProperty); }
set { SetValue (BorderColorProperty, value); }
}
public static readonly BindableProperty FontSizeProperty =
BindableProperty.Create<LineEntry, double> (p => p.FontSize, Font.Default.FontSize);
public double FontSize {
get { return (double)GetValue (FontSizeProperty); }
set { SetValue (FontSizeProperty, value); }
}
public static readonly BindableProperty PlaceholderColorProperty =
BindableProperty.Create<LineEntry, Color> (p => p.PlaceholderColor, Color.Default);
public Color PlaceholderColor {
get { return (Color)GetValue (PlaceholderColorProperty); }
set { SetValue (PlaceholderColorProperty, value); }
}
}
}
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using UIKit;
using YOUTNAMESPACE.iOS;
using System.ComponentModel;
using CoreAnimation;
using Foundation;
[assembly: ExportRenderer (typeof(YOUTNAMESPACE.LineEntry), typeof(LineEntryRenderer))]
namespace YOUTNAMESPACE.iOS
{
public class LineEntryRenderer: EntryRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged (e);
if (Control != null) {
Control.BorderStyle = UITextBorderStyle.None;
var view = (Element as LineEntry);
if (view != null) {
DrawBorder (view);
SetFontSize (view);
SetPlaceholderTextColor (view);
}
}
}
protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged (sender, e);
var view = (LineEntry)Element;
if (e.PropertyName.Equals (view.BorderColor))
DrawBorder (view);
if (e.PropertyName.Equals (view.FontSize))
SetFontSize (view);
if (e.PropertyName.Equals (view.PlaceholderColor))
SetPlaceholderTextColor (view);
}
void DrawBorder (LineEntry view)
{
var borderLayer = new CALayer ();
borderLayer.MasksToBounds = true;
borderLayer.Frame = new CoreGraphics.CGRect (0f, Frame.Height / 2, Frame.Width, 1f);
borderLayer.BorderColor = view.BorderColor.ToCGColor ();
borderLayer.BorderWidth = 1.0f;
Control.Layer.AddSublayer (borderLayer);
Control.BorderStyle = UITextBorderStyle.None;
}
void SetFontSize (LineEntry view)
{
if (view.FontSize != Font.Default.FontSize)
Control.Font = UIFont.SystemFontOfSize ((System.nfloat)view.FontSize);
else if (view.FontSize == Font.Default.FontSize)
Control.Font = UIFont.SystemFontOfSize (17f);
}
void SetPlaceholderTextColor (LineEntry view)
{
if (string.IsNullOrEmpty (view.Placeholder) == false && view.PlaceholderColor != Color.Default) {
var placeholderString = new NSAttributedString (view.Placeholder,
new UIStringAttributes { ForegroundColor = view.PlaceholderColor.ToUIColor () });
Control.AttributedPlaceholder = placeholderString;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment