Xamarin iOS - 带左图的UITextField填充

Nul*_*sis 3 xamarin.ios xamarin

我已经设置了我的UITextField的LeftView,这样我就可以在文本旁边画一个小图标了.

Password.LeftView = new UIImageView(UIImage.FromBundle("LockAndKey"));
Password.LeftViewMode = UITextFieldViewMode.Always;
Run Code Online (Sandbox Code Playgroud)

这很好但现在的问题是占位符和实际文本太靠近图像了 - 我想缩进文本.

在Xamarin/iOS中我需要做什么才能使我的子类UITextField以缩进的方式缩进文本?我知道我可以覆盖各种功能但到目前为止还没有成功使用它.

谢谢!

pin*_*dax 5

您需要扩展/子类化UITextField类并覆盖调用的方法DrawText.在那里你添加你需要的填充.

    public override void DrawText(CGRect rect)
    {
        var padding = new UIEdgeInsets (0, 10, 0, 0);

        base.DrawText( padding.InsetRect(rect));
    }
Run Code Online (Sandbox Code Playgroud)

这将在左侧添加10点填充.

为了使它更具可定制性,我将添加一个名为Padding的属性,基本上你可以根据情况设置所需的填充.

*更新#1*

如果您希望在键入时拥有空间,您可以将表示您的LeftView的UIImageView的宽度稍大一些,并使用ViewContentMode

使用你的例子:

var leftView = new UIImageView(UIImage.FromBundle("LockAndKey"));
leftView.Frame = new CGRect (leftView.Frame.X, leftView.Frame.Y, leftView.Frame.Width + 15, leftView.Frame.Height);
leftView.ContentMode = UIViewContentMode.Center;

Password.LeftView = leftView
Password.LeftViewMode = UITextFieldViewMode.Always;
Run Code Online (Sandbox Code Playgroud)

使用此配置,您将在ImageView的每个尺寸上获得7.5个点.您可以使用其他ContentMode使其按您的意愿工作.

****更新#2****

刚刚找到另一种方式.

在你的子类UITextField中覆盖这两个方法:

    public override CGRect TextRect (CGRect forBounds)
    {
        var padding = new UIEdgeInsets (0, 20, 0, 0);

        return base.TextRect (padding.InsetRect(forBounds));
    }

    public override CGRect EditingRect (CGRect forBounds)
    {
        return TextRect (forBounds);
    }
Run Code Online (Sandbox Code Playgroud)

这个更干净,作为第一个解决方案,您可以自定义它.