在的UITextField静态字符的前缀(A static character prefix in

2019-07-30 04:50发布

是否有一个内置的方式,以一个字符添加前缀到UITextField像下面的屏幕截图?

如果没有,什么是完成这一任务的最好的,最直接的方法是什么? 我想到的是background属性可能能够做到这一点。

Answer 1:

简单地增加一个灰色UILabel在顶部UITextField的伎俩:

注意UILabel就像一个背景图片,输入的文本停留在顶端:

UPDATE

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

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

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



Answer 2:

从继安妮的代码,你也可以做到这一点直接在代码中没有的UILabel在IB和UIView的代码:

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


Answer 3:

随着Ditiet的解决方案 (使用尺寸为15的系统字体视网膜),文本字段放置它的文本0.5点太近美元符号。 使用-sizeWithAttributes:我适合width美元符号标签至约8.5,但该文本字段以定位它的文本x的8(左视图的宽度的底板)。

我发现了两个解决方案,以完美的美元符号(左视图)与文本之间的相对位置。

解决方案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和覆盖它的定位

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

// 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可能会导致移位,但有更少的代码,仍然看起来完美的像素。 我只想到的IT解决方案2.解决方案后2是典雅,并支持您使用的自动布局(或自动尺寸)来调整文本字段的高度。



Answer 4:

不认为你可以做到这一点作为其一部分UITextField孤独。

我可以的事情的一种方法是使你UITextField无国界的,并保持一个UILabel在左侧(但相邻) UITextField 。 最后,如果你想境界比把这些2个元素(的UITextField和的UILabel)一个UIView内,给边界这一观点。 此设置应该为你搭起了图像完全相同。

让我知道这是否正常工作了。

更新 :你可以做的@Anne点,但有文字跑对的UILabel顶部的风险。 我觉得我的建议是更好的。



Answer 5:

要添加到安妮的答案。 你也可以把它一个UIImageView,并使用你想有任何图像。 有了一个UIImageView,你可以设置背景为白色,以便文本将它塞到下面。



文章来源: A static character prefix in UITextField