2017-02-13 57 views
2

我已经设置了我的UITextField的左视图,以便我可以在文本旁边画一个小图标。Xamarin iOS - 用左图像填充UITextField

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

这个伟大的工程,但现在的问题是,占位符和实际文本是太接近的形象 - 我想文本缩进了。

我需要在Xamarin/iOS中为我的子类UITextField使用边距缩进文本做什么?我知道有很多功能可以覆盖,但至今尚未取得成功。

谢谢!

回答

3

您需要扩展/继承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); 
    } 

这一个是清洁,作为第一个解决方案,您可以自定义。

+0

这对我输入后的文本有效,但不是占位符,或者当我输入时。是否有额外的覆盖,我可以为那些?:)非常感谢花时间来帮助我! – NullHypothesis

+0

谢谢!就是这样! – NullHypothesis