UITextField中的静态字符前缀

时间:2012-07-01 20:45:18

标签: ios cocoa-touch user-interface uitextfield

是否有内置方法可以为UITextField添加字符前缀,如下面的屏幕截图所示?

enter image description here

如果不是,那么最好,最直接的方法是什么?我认为background属性可能会这样做。

5 个答案:

答案 0 :(得分:16)

只需在UILabel之上添加灰色UITextField即可:

001 002

请注意,UILabel的行为类似于背景图片,输入的文字位于顶部:

003

<强>更新

此外,您可以使用以下代码向UITextField添加一些填充:

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

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

答案 1 :(得分:9)

Anne's代码开始,您也可以直接在代码中执行此操作,而无需使用IB中的UILabel和代码中的UIView:

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

答案 2 :(得分:2)

使用Ditiet's solution(在使用15号系统字体的视网膜上),文本字段将其文本定位为0.5点,太靠近美元符号。使用-sizeWithAttributes:,我将美元符号标签的width设置为大约8.5,但文本字段将其文本定位在x为8(左视图宽度的底部)。 / p>

我找到了两种解决方案来完善美元符号(左视图)和...之间的相对位置。文本。

解决方案1:右对齐美元符号

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

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];

虽然这个解决方案完善了美元符号标签(左视图)和...之间的相对位置。文本,它可能会增加美元符号标签的宽度(不超过1磅),导致文本字段宽度的相同增加,并将所有文本向右移动相同的数量。

如果文本字段的高度发生变化(例如,由于自动布局(或自动调整)),我不建议使用此解决方案。

解决方案2:子类UITextField&amp;覆盖其定位

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

// 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

结论

两种解决方案似乎都运作良好。解决方案1可能会导致转换,但代码较少,仍然看起来像素完美。在解决方案2之后我才想到它。解决方案2很优雅,支持您使用自动布局(或自动调整)来调整文本字段的高度。

答案 3 :(得分:0)

不要认为你可以单独作为UITextField的一部分来做这件事。

我可以做的一件事就是让你的UITextField无边界,并在UILabel的左边(但相邻)保持UITextField。最后,如果你想要边框而不是将这两个元素(UITextField和UILabel)放在UIView中并给这个视图边框。此设置应与您提供的图像完全相同。

让我知道这是否成功。

更新:你可以像@Anne点那样做,但是在UILabel之上存在文本运行的风险。我觉得我的建议更好。

答案 4 :(得分:0)

添加安妮的回答。你也可以把它变成UIImageView并使用你想要的任何图像。使用UIImageView,您可以将背景设置为白色,这样文本就会隐藏在它下面。