Изменение фона UITextField при редактировании

Я хотел бы изменить фоновое изображение UITextField, когда он станет первымResponder, чтобы показать пользователю, что он имеет фокус, аналогично псевдо-классам: active или: focus в CSS.

Я предполагаю, что мне может понадобиться сделать это программно; поэтому любая помощь очень ценится.

-Giles

Ответ 1

Вы также можете использовать методы UITextFieldDelegate (IMHO, проще поддерживать, чем наблюдатели с ключом):

#pragma mark -
#pragma mark UITextFieldDelegate methods

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    _field.background = [UIImage imageNamed:@"focus.png"];
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    _field.background = [UIImage imageNamed:@"nofocus.png"];
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

Это работает только тогда, когда свойство UITextField.borderStyle имеет любой тип, но UITextBorderStyleRoundedRect (в этом случае свойство фона не учитывается). Это означает, что вы можете использовать приведенный выше код с UITextBorderStyleBezel, UITextBorderStyleLine и UITextBorderStyleNone, как описано в документации borderStyle:

borderStyle

Стиль границы, используемый текстовым полем.

@property (неатомный) UITextBorderStyle borderStyle

Обсуждение

Значение по умолчанию для этого свойства UITextBorderStyleNone. Если пользовательский фоновое изображение установлено, это свойство игнорируется.

Это документация для свойства background UITextField:

фон

Изображение, представляющее фоновый вид текста если он включен.

@property (неатомный, сохраняющий) UIImage * Фон

Обсуждение

Когда установлено, изображение, на которое ссылается это свойство заменяет стандарт внешний вид, контролируемый свойство borderStyle. Задний план изображения рисуются на границе прямоугольная часть изображения. Изображений вы используете для текстовых полей фон должен уметь растягиваться чтобы соответствовать.

Ответ 2

Самый чистый способ IMHO - подкласс UITextField и переопределить becomeFirstResponder и resignFirstResponder, чтобы изменить фоновое изображение текстового поля. Таким образом, вы можете использовать свой новый подкласс где угодно, не переустраивая методы делегата для изменения фона.

- (BOOL)becomeFirstResponder {
    BOOL outcome = [super becomeFirstResponder];
    if (outcome) {
      self.background = // selected state image;
    }
    return outcome;
}

- (BOOL)resignFirstResponder {
    BOOL outcome = [super resignFirstResponder];
    if (outcome) {
      self.background = // normal state image;
    }
    return outcome;
}

Ответ 3

Вероятно, вы можете попробовать наблюдать за изменениями в isFirstResponder. и изменение фона в методе уведомления. Что-то вроде:

[textField addObserver:theObserver forKeyPath:@"isFirstResponder" options:0 context:nil];

Тогда в наблюдателе:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if(object == textField && [keyPath isEqual:@"isFirstResponder"]) {
        //fiddle with object here
    }
}