Xamarin.forms Xamarin表单输入框在iOS中不会水平滚动

Xamarin.forms Xamarin表单输入框在iOS中不会水平滚动,xamarin.forms,Xamarin.forms,如果我在Xamarin Forms项目中有一个条目,并且我一直在上面键入,直到它离开可查看页面的末尾,文本在iOS中不会像在Android上那样水平滚动-有没有办法让它这样做 我试着用编辑器替换它,但它没有占位符,我需要占位符。一个条目在iOS上呈现为UITextField,它不支持滚动。编辑器呈现为不支持滚动的UITextView 一个选项是创建包含占位符的自定义编辑器 我有这方面的代码。虽然不漂亮,但很管用 以下是CustomEditor代码,包括占位符文本和颜色的新可绑定属性 pub

如果我在Xamarin Forms项目中有一个
条目
,并且我一直在上面键入,直到它离开可查看页面的末尾,文本在iOS中不会像在Android上那样水平滚动-有没有办法让它这样做


我试着用编辑器替换它,但它没有占位符,我需要占位符。

一个条目在iOS上呈现为UITextField,它不支持滚动。编辑器呈现为不支持滚动的UITextView

一个选项是创建包含占位符的自定义编辑器

我有这方面的代码。虽然不漂亮,但很管用

以下是CustomEditor代码,包括占位符文本和颜色的新可绑定属性

   public class CustomEditor : Editor
    {
        public static readonly BindableProperty PlaceholderProperty =
            BindableProperty.Create(nameof(Placeholder), typeof(string), typeof(CustomEditor), default(string));

        public string Placeholder
        {
            get { return (string)GetValue(PlaceholderProperty); }
            set { SetValue(PlaceholderProperty, value); }
        }

        public static readonly BindableProperty PlaceholderColorProperty =
            BindableProperty.Create(nameof(PlaceholderColor), typeof(Color), typeof(CustomEditor), default(Color));

        public Color PlaceholderColor
        {
            get { return (Color)GetValue(PlaceholderColorProperty); }
            set { SetValue(PlaceholderColorProperty, value); }
        }

        public static readonly BindableProperty DisabledColorProperty =
            BindableProperty.Create(nameof(DisabledColor), typeof(Color), typeof(CustomEditor), default(Color));

        public Color DisabledColor
        {
            get { return (Color)GetValue(DisabledColorProperty); }
            set { SetValue(DisabledColorProperty, value); }
        }
    }
这是iOS自定义渲染器

[assembly: ExportRenderer(typeof(CustomEditor), typeof(CustomEditorRenderer))]
namespace Test.iOS.CustomRenderers
{
    public class CustomEditorRenderer : EditorRenderer
    {
        private UILabel PlaceholderLabel { get; set; }

        protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
        {
            base.OnElementChanged(e);

            if (Control == null) return;

            Control.Layer.BorderWidth = 0.5f;
            Control.Layer.CornerRadius = 8;
            Control.Layer.BorderColor = Color.FromHex("CDCDCD").ToCGColor();

            if (PlaceholderLabel != null) return;

            var element = Element as CustomEditor;

            PlaceholderLabel = new UILabel
            {
                Text = element?.Placeholder,
                TextColor = element?.PlaceholderColor.ToUIColor(),
                BackgroundColor = UIColor.Clear
            };

            var edgeInsets = Control.TextContainerInset;
            var lineFragmentPadding = Control.TextContainer.LineFragmentPadding;

            Control.AddSubview(PlaceholderLabel);

            var vConstraints = NSLayoutConstraint.FromVisualFormat(
                "V:|-" + edgeInsets.Top + "-[PlaceholderLabel]-" + edgeInsets.Bottom + "-|", 0, new NSDictionary(),
                NSDictionary.FromObjectsAndKeys(
                    new NSObject[] { PlaceholderLabel }, new NSObject[] { new NSString("PlaceholderLabel") })
            );

            var hConstraints = NSLayoutConstraint.FromVisualFormat(
                "H:|-" + lineFragmentPadding + "-[PlaceholderLabel]-" + lineFragmentPadding + "-|",
                0, new NSDictionary(),
                NSDictionary.FromObjectsAndKeys(
                    new NSObject[] { PlaceholderLabel }, new NSObject[] { new NSString("PlaceholderLabel") })
            );

            PlaceholderLabel.TranslatesAutoresizingMaskIntoConstraints = false;

            Control.AddConstraints(hConstraints);
            Control.AddConstraints(vConstraints);

            PlaceholderLabel.Hidden = Element.Text.NotEmpty();
        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "Text")
            {
                PlaceholderLabel.Hidden = Control.Text.NotEmpty();
            }

            if (e.PropertyName == VisualElement.IsEnabledProperty.PropertyName)
            {
                var element = Element as CustomEditor;
                SetTextColor(element);
            }
        }

        private void SetTextColor(CustomEditor element)
        {
            Control.TextColor = element.IsEnabled ? element.TextColor.ToUIColor() : element.DisabledColor.ToUIColor();
        }
    }
}
[程序集:ExportRenderer(typeof(CustomEditor)、typeof(CustomEditorRenderer))]
命名空间Test.iOS.CustomRenders
{
公共类CustomEditorRenderer:EditorRenderer
{
专用UILabel占位符标签{get;set;}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(Control==null)返回;
Control.Layer.BorderWidth=0.5f;
Control.Layer.CornerRadius=8;
Control.Layer.BorderColor=Color.FromHex(“CDCDCD”).togcolor();
如果(占位符标签!=null)返回;
var element=作为CustomEditor的元素;
占位符标签=新UILabel
{
Text=元素?.占位符,
TextColor=element?.PlaceholderColor.ToUIColor(),
BackgroundColor=UIColor.Clear
};
var edgeInsets=Control.TextContainerSet;
var lineFragmentPadding=Control.TextContainer.lineFragmentPadding;
Control.AddSubview(占位符标签);
var vConstraints=NSLayoutConstraint.FromVisualFormat(
“V:|-”+edgeInsets.Top+”-[Placeholder Label]-“+edgeInsets.Bottom+”-“|”,0,新NSDictionary(),
NSDictionary.FromObjectsAndKeys(
新NSObject[]{Placeholder Label},新NSObject[]{new NSString(“Placeholder Label”)})
);
var hConstraints=NSLayoutConstraint.FromVisualFormat(
“H:|-”+lineFragmentPadding+“-[PlaceholderLabel]-“+lineFragmentPadding+”-|“,
0,新的NSDictionary(),
NSDictionary.FromObjectsAndKeys(
新NSObject[]{Placeholder Label},新NSObject[]{new NSString(“Placeholder Label”)})
);
Placeholder Label.TranslatesAutoResizezingMaskintoConstraints=false;
控制。添加约束(hConstraints);
控制。添加约束(vConstraints);
占位符label.Hidden=Element.Text.NotEmpty();
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(发送方,e);
如果(例如,PropertyName==“文本”)
{
占位符label.Hidden=Control.Text.NotEmpty();
}
if(e.PropertyName==VisualElement.IsEnabledProperty.PropertyName)
{
var element=作为CustomEditor的元素;
色(元素);
}
}
私有void SetTextColor(CustomEditor元素)
{
Control.TextColor=element.IsEnabled?element.TextColor.ToUIColor():element.DisabledColor.ToUIColor();
}
}
}