Xamarin Forms Entry框不会在iOS中水平滚动

时间:2017-11-06 20:59:36

标签: xamarin.forms

如果我的Xamarin Forms项目中有Entry并且我一直在输入它,直到它从可查看页面的末尾开始,文本不会像在Android上那样在iOS中水平滚动 - 是否有这样做的方法呢?

我尝试用编辑器替换它,但是我没有占位符,这是我需要的。

1 个答案:

答案 0 :(得分:1)

条目在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();
        }
    }
}