Есть ли встроенный способ добавить префикс символа к UITextField
, как показано на скриншоте ниже?
Если нет, то какой лучший, самый простой способ сделать это? Я думаю, что свойство background
могло бы это сделать.
Есть ли встроенный способ добавить префикс символа к UITextField
, как показано на скриншоте ниже?
Если нет, то какой лучший, самый простой способ сделать это? Я думаю, что свойство background
могло бы это сделать.
Просто добавление серого UILabel
поверх UITextField
делает трюк:
Обратите внимание, что UILabel
ведет себя как фоновое изображение, введенный текст остается сверху:
UPDATE
Кроме того, вы можете добавить дополнение к UITextField
, используя следующий код:
UIView *thePadding = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 20)];
theTextField.leftView = thePadding;
theTextField.leftViewMode = UITextFieldViewModeAlways;
Таким образом, текст не может содержать символ префикса.
Отрегулируйте прямоугольник, чтобы он работал правильно в вашей ситуации.
В соответствии с кодом 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];
С Ditiet solution (на сетчатке, используя системный шрифт размера 15), текстовое поле позиционировало свой текст на 0,5 пункта слишком близко к знаку доллара. Используя -sizeWithAttributes:
, я сопоставляю width
знака знака доллара примерно до 8,5, но текстовое поле позиционирует его текст с x
из 8 (пол левой ширины).
Я нашел два решения, чтобы улучшить относительное расположение между значком доллара (левым) и текстом.
Установите ширину ярлыка знака доллара на потолок ширины знака доллара (или его жесткий код). Затем правильно выровняйте текст метки знака доллара.
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 пт), что приведет к такому же увеличению текста ширину поля и смещение всего текста вправо на ту же сумму.
Я не рекомендую это решение, если высота текстового поля изменится, например, из-за автоматической компоновки (или автоматической настройки).
Это решение поддерживает автоматическую компоновку (или автоматизацию) для настройки высоты текстового поля.
// 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 элегантно и поддерживает автоматическую компоновку (или автоматизацию), чтобы настроить высоту текстового поля.
Не думайте, что вы можете сделать это как часть UITextField
.
Один из способов - сделать ваш UITextField
без полей и оставить UILabel
слева (но рядом) с UITextField
. И, наконец, если вы хотите границы, чем положить эти 2 элемента (UITextField и UILabel) внутри UIView и предоставить границу этому представлению. Эта настройка должна выглядеть точно так же, как и изображение, которое вы разместили.
Сообщите мне, если это получится.
UPDATE: вы можете делать это как @Anne, но существует риск того, что текст будет работать поверх UILabel. Я чувствую, что предлагаю лучше.
Чтобы добавить к Anne ответ. Вы также можете сделать его UIImageView и использовать любое изображение, которое вы хотите там. С помощью UIImageView вы можете установить фон в белый цвет, чтобы текст был под ним.