UITextField中的静态字符前缀

有没有一种内置的方式来添加一个字符前缀到UITextField像下面的截图?

在这里输入图像说明

如果不是,那么最好,最直接的方法是完成这个任务? 我在想background属性可以做到这一点。

简单地在UITextField顶部添加一个灰色的UILabel就可以实现:

001002

请注意, UILabel行为像一个背景图像,input的文字保持在最前面:

003

UPDATE

另外,您可以使用以下代码将一些填充添加到UITextField

 UIView *thePadding = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]; theTextField.leftView = thePadding; theTextField.leftViewMode = UITextFieldViewModeAlways; 

这样文本不能覆盖前缀字符。
调整矩形使其在您的情况下正常工作。

从Anne的代码开始,你也可以直接在代码中执行此操作,而不需要IB和UIView中的UILabel:

 UILabel *poundLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 5, 20)]; poundLabel.text = @"£"; [self.paymentAmount setLeftView:poundLabel]; [self.paymentAmount setLeftViewMode:UITextFieldViewModeAlways]; 

随着Ditiet的解决scheme (在使用15号系统字体的视网膜上),文本字段将其文本0.5点定位得太接近美元符号。 使用-sizeWithAttributes:我将美元符号标签的width设置为大约8.5,但是文本字段将其文本定位在x的8(左视图宽度的底部)处。

我发现了两个解决scheme来完善美元符号(左视图)和文本之间的相对定位。

解决scheme1:右alignment美元符号

将美元符号标签的宽度设置为美元符号宽度的上限(或硬编码)。 然后,右alignment美元符号标签的文本。

 UIFont *font = [UIFont systemFontOfSize:15]; UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 200, 120, 44)]; textField.font = font; NSString *dollarSignText = @"$"; CGSize size = [dollarSignText sizeWithAttributes:@{NSFontAttributeName: font}]; UILabel *dollarSignLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ceilf(size.width), 44)]; dollarSignLabel.font = font; dollarSignLabel.text = dollarSignText; dollarSignLabel.textAlignment = NSTextAlignmentRight; textField.leftView = dollarSignLabel; textField.leftViewMode = UITextFieldViewModeAlways; [self.view addSubview:textField]; 

虽然这个解决scheme完善了美元符号标签(左视图)和文本之间的相对定位,但它可能会增加美元符号标签的宽度(不超过1pt),导致文本字段宽度的增加把所有的文字右移相同的数量。

如果文本字段的高度会发生变化,例如由于自动布局(或自动调整),我不推荐这种解决scheme。

解决scheme2:子类UITextField&覆盖其定位

此解决scheme支持您使用自动布局(或自动调整)来调整文本字段的高度。

 // VVMAmountTextField.h @import UIKit; @interface VVMAmountTextField : UITextField @end // VVMAmountTextField.m #import "VVMAmountTextField.h" @implementation VVMAmountTextField #pragma mark - UIView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIFont *font = [UIFont systemFontOfSize:15]; self.font = font; self.keyboardType = UIKeyboardTypeDecimalPad; self.placeholder = @"0.00"; // Set leftView to dollarSignLabel ($). UILabel *dollarSignLabel = [[UILabel alloc] initWithFrame:CGRectZero]; dollarSignLabel.backgroundColor = [UIColor whiteColor]; dollarSignLabel.font = font; dollarSignLabel.text = @"$"; self.leftView = dollarSignLabel; self.leftViewMode = UITextFieldViewModeAlways; } return self; } #pragma mark - UITextField // Override positioning to make things pixel perfect. #define DOLLAR_SIGN_WIDTH() [((UILabel *)self.leftView).text sizeWithAttributes:@{NSFontAttributeName: self.font}].width - (CGRect)textRectForBounds:(CGRect)bounds { bounds = [super textRectForBounds:bounds]; bounds.origin.x = DOLLAR_SIGN_WIDTH(); return bounds; } - (CGRect)editingRectForBounds:(CGRect)bounds { bounds = [super editingRectForBounds:bounds]; bounds.origin.x = DOLLAR_SIGN_WIDTH(); return bounds; } - (CGRect)leftViewRectForBounds:(CGRect)bounds { bounds.size.width = DOLLAR_SIGN_WIDTH(); return bounds; } @end 

结论

这两种解决scheme似乎都很好。 解决scheme1可能会导致一个转变,但代码较less,仍然看起来像素完美。 我只想到解决scheme2后。解决scheme2是优雅的,并支持您使用自动布局(或自动调整)来调整文本字段的高度。

不要以为你可以单独做UITextField一部分。

我可以做的一个方法是使你的UITextField无边界,并保持在UITextField左侧(但相邻)的UILabel 。 最后,如果你想要边框,而不是把这两个元素(UITextField和UILabel)放在一个UIView中,并给这个视图添加边框。 这个设置应该和你放置的图像完全一样。

让我知道这是否成功。

更新 :你可以做@Anne点,但是在UILabel上面有文本运行的风险。 我觉得我build议更好。

添加到安妮的答案。 你也可以使它成为一个UIImageView并使用你想要的任何图像。 使用UIImageView,您可以将背景设置为白色,这样文字就可以隐藏在底下。