Префикс статического символа в UITextField

Есть ли встроенный способ добавить префикс символа к UITextField, как показано на скриншоте ниже?

enter image description here

Если нет, то какой лучший, самый простой способ сделать это? Я думаю, что свойство background могло бы это сделать.

Ответ 1

Просто добавление серого UILabel поверх UITextField делает трюк:

001002

Обратите внимание, что UILabel ведет себя как фоновое изображение, введенный текст остается сверху:

003

UPDATE

Кроме того, вы можете добавить дополнение к UITextField, используя следующий код:

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

Таким образом, текст не может содержать символ префикса.
Отрегулируйте прямоугольник, чтобы он работал правильно в вашей ситуации.

Ответ 2

В соответствии с кодом Anne's вы также можете сделать это непосредственно в коде без UILabel в IB и UIView в коде:

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

Ответ 3

С Ditiet solution (на сетчатке, используя системный шрифт размера 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, скорее всего, вызовет сдвиг, но имеет меньше кода и по-прежнему выглядит идеально. Я только подумал об этом после решения 2. Решение 2 элегантно и поддерживает автоматическую компоновку (или автоматизацию), чтобы настроить высоту текстового поля.

Ответ 4

Не думайте, что вы можете сделать это как часть UITextField.

Один из способов - сделать ваш UITextField без полей и оставить UILabel слева (но рядом) с UITextField. И, наконец, если вы хотите границы, чем положить эти 2 элемента (UITextField и UILabel) внутри UIView и предоставить границу этому представлению. Эта настройка должна выглядеть точно так же, как и изображение, которое вы разместили.

Сообщите мне, если это получится.

UPDATE: вы можете делать это как @Anne, но существует риск того, что текст будет работать поверх UILabel. Я чувствую, что предлагаю лучше.

Ответ 5

Чтобы добавить к Anne ответ. Вы также можете сделать его UIImageView и использовать любое изображение, которое вы хотите там. С помощью UIImageView вы можете установить фон в белый цвет, чтобы текст был под ним.