UITextField中的静态字符前缀
有没有一种内置的方式来添加一个字符前缀到UITextField
像下面的截图?
如果不是,那么最好,最直接的方法是完成这个任务? 我在想background
属性可以做到这一点。
简单地在UITextField
顶部添加一个灰色的UILabel
就可以实现:
请注意, UILabel
行为像一个背景图像,input的文字保持在最前面:
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,您可以将背景设置为白色,这样文字就可以隐藏在底下。