11

有没有一种内置的方法可以将字符前缀添加到UITextField下面的屏幕截图中?

在此处输入图像描述

如果不是,那么最好、最直接的方法是什么?我认为该background物业可能能够做到这一点。

4

5 回答 5

16

只需UILabel在顶部添加灰色即可UITextField

001 002

请注意,它的UILabel行为类似于背景图像,输入的文本保持在顶部:

003

更新

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

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

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

于 2012-07-01T20:56:22.053 回答
9

安妮的代码之后,您也可以直接在代码中执行此操作,而无需 IB 中的 UILabel 和代码中的 UIView:

UILabel *poundLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
poundLabel.text = @"£";
[self.paymentAmount setLeftView:poundLabel];
[self.paymentAmount setLeftViewMode:UITextFieldViewModeAlways];
于 2012-10-17T11:07:54.513 回答
2

使用Ditiet 的解决方案(在视网膜上使用 15 号系统字体),文本字段将其文本定位为 0.5 点,距离美元符号太近了。使用-sizeWithAttributes:,我width将美元符号标签的值设置为大约 8.5,但文本字段将其文本定位在x8 处(左视图宽度的下限)。

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

解决方案 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 pt),从而导致文本字段的宽度和将所有文本向右移动相同的量。

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

解决方案 2:继承 UITextField 并覆盖其定位

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

// 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 很优雅,支持您使用自动布局(或自动调整大小)来调整文本字段的高度。

于 2013-09-25T03:14:11.103 回答
0

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

我可以做到的一种方法是让你的UITextField无边界并UILabelUITextField. 最后,如果您想要边框,而不是将这两个元素(UITextField 和 UILabel)放在 UIView 中并为该视图提供边框。此设置应与您放置的图像完全相同。

让我知道这是否可行。

更新:您可以按照@Anne 的观点进行操作,但存在文本在 UILabel 之上运行的风险。我觉得我建议的更好。

于 2012-07-01T20:55:59.993 回答
0

添加到安妮的答案。您也可以将其设为 UIImageView 并使用您想要的任何图像。使用 UIImageView,您可以将背景设置为白色,以便将文本隐藏在其下方。

于 2012-07-01T20:59:20.720 回答