Xamarin iOS - UITextField填充左图像

时间:2017-02-13 22:47:26

标签: xamarin xamarin.ios

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

Password.LeftView = new UIImageView(UIImage.FromBundle("LockAndKey"));
Password.LeftViewMode = UITextFieldViewMode.Always;

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

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

谢谢!

1 个答案:

答案 0 :(得分:5)

您需要扩展/子类化UITextField类并覆盖名为DrawText的方法。在那里你添加了你需要的填充。

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

        base.DrawText( padding.InsetRect(rect));
    }

这将在左侧添加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;

使用此配置,每个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);
    }

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