编辑开始时更改UITextField背景

Gil*_*sen 11 iphone objective-c first-responder

我想改变UITextField的背景图像,当它成为第一个响应者时,向用户显示它有焦点,类似于CSS中的:active或:focus伪类.

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

-Giles

Zic*_*nic 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;
}
Run Code Online (Sandbox Code Playgroud)


Adr*_*ski 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;
}
Run Code Online (Sandbox Code Playgroud)

这仅适用于UITextField.borderStyle属性属于任何类型但UITextBorderStyleRoundedRect(在这种情况下,不考虑background属性).这意味着您可以将上面的代码与UITextBorderStyleBezel,UITextBorderStyleLine和UITextBorderStyleNone一起使用,如borderStyle文档中所述:

的borderStyle

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

@property(非原子)UITextBorderStyle borderStyle

讨论

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

这是UITextField的background属性的文档:

背景

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

@property(非原子,保留)UIImage*背景

讨论

设置时,此属性引用的图像将替换borderStyle属性控制的标准外观.在图像的边界矩形部分中绘制背景图像.用于文本字段背景的图像应该能够伸展以适应.