gpt4 book ai didi

c# - 在 Xamarin Forms for iOS 的底部和编辑器上添加边框

转载 作者:行者123 更新时间:2023-11-30 17:29:31 24 4
gpt4 key购买 nike

我目前在我的 Xamarin 表单应用程序中有输入字段,它们在 iOS 上只有底部边框,使用以下自定义渲染器可以完美地工作:

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;
}
}
}
}

但是,当我将相同的逻辑应用于编辑器(多行 UITextField)时,边框会出现在它应该出现的位置,但是在键入多行时,边框会随着按顺序的文本向上移动编辑器。我怎样才能避免这种情况,使底部边框保持在同一个地方?

最佳答案

解决方案

在 Xamarin Forms Editor 的自定义渲染器中,您需要做两件事:

  1. 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 方法导致其显示不正确之前,我们添加了 subview 。

我们创建一个 CALayer,然后将其添加到子层,然后在每次调用 LayoutSubviews 时编辑它的原因是,如果您的编辑器(iOS 中的 UITextField)尺寸扩大或缩小,边框将跟随容器本身.如果用户添加了此附加功能以允许这样做,这一点很重要。

希望这可以帮助任何遇到过与我拔头发至少一天相同问题的人!

关于c# - 在 Xamarin Forms for iOS 的底部和编辑器上添加边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51023111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com