Решение
В пользовательском рендерере для редактора форм Xamarin вам нужно сделать две вещи:
private CALayer borderLayer;
int sublayerNumber = 0;
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
if (Control != null)
{
borderLayer = new CALayer();
Control.Layer.AddSublayer(borderLayer);
sublayerNumber = Control.Layer.Sublayers.Length - 1;
Вы должны сделать borderLayer глобальным, затем создать другую глобальную переменную с именем sublayerNumber и затем внутри OnElementChanged, после проверки, существует ли элемент управления, создать экземпляр CALayer, а затем добавить пустой слой в подслои и получить его индекс в массиве подслоев. .
2
public override void LayoutSubviews()
{
base.LayoutSubviews();
Control.Layer.Sublayers[sublayerNumber].MasksToBounds = true;
Control.Layer.Sublayers[sublayerNumber].Frame = new CoreGraphics.CGRect(0f, Frame.Height - 5, Frame.Width, 1f);
Control.Layer.Sublayers[sublayerNumber].BorderColor = Color.FromHex("YOUR-HEX-CODE-HERE").ToCGColor();
Control.Layer.Sublayers[sublayerNumber].BorderWidth = 1.0f;
}
Переопределите метод LayoutSubviews, а затем отредактируйте определенный слой, который мы создали в OnElementChanged, с использованием самой последней высоты и ширины кадра и т. Д.
Причина
Прежде чем мы добавили подпредставление до вызова метода layoutsubviews, из-за чего оно отображалось некорректно.
Причина, по которой мы создаем один CALayer, а затем добавляем его в подслои и затем редактируем его при каждом вызове LayoutSubviews, заключаются в том, что если ваш редактор (UITextField в iOS) расширяется в размере или сокращается в размере, граница будет следовать за самим контейнером , Это важно, если пользователь добавил эту дополнительную функциональность, чтобы разрешить это.
Надеюсь, что это поможет любому, у кого была такая же проблема, как и то, что я вырывал свои волосы хотя бы один день!