11

我想在 UITextField 成为 firstResponder 时更改它的背景图像,以向用户显示它具有焦点,类似于 CSS 中的 :active 或 :focus 伪类。

我猜我可能需要以编程方式执行此操作;所以非常感谢任何帮助。

-贾尔斯

4

4 回答 4

29

恕我直言,最干净的方法是子类化UITextField和覆盖becomeFirstResponderresignFirstResponder更改文本字段的背景图像。这样,您可以在任何地方使用您的新子类,而无需重新实现委托方法来更改背景。

- (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;
}
于 2012-07-25T23:12:05.367 回答
27

您不妨使用 UITextFieldDelegate 方法(恕我直言,比键值观察者更易于维护):

#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 文档中所述:

边框样式

文本字段使用的边框样式。

@property(nonatomic) UITextBorderStyle 边框样式

讨论

此属性的默认值为 UITextBorderStyleNone。如果设置了自定义背景图像,则忽略此属性。

这是 UITextField 的背景属性的文档:

背景

表示启用时文本字段的背景外观的图像。

@property(nonatomic, 保留) UIImage *background

讨论

设置后,此属性引用的图像将替换由borderStyle 属性控制的标准外观。背景图像绘制在图像的边框矩形部分。您用于文本字段背景的图像应该能够拉伸以适应。

于 2010-01-03T15:47:58.653 回答
3

斯威夫特 4

textField.addTarget(self, action: #selector(anyFunction), for: UIControlEvents.editingDidBegin)


@objc func anyFunction() {
    // Add your conde here
}
于 2018-04-30T10:20:54.060 回答
0

您或许可以尝试观察 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
    }
}
于 2010-01-03T01:47:22.940 回答