我想在 UITextField 成为 firstResponder 时更改它的背景图像,以向用户显示它具有焦点,类似于 CSS 中的 :active 或 :focus 伪类。
我猜我可能需要以编程方式执行此操作;所以非常感谢任何帮助。
-贾尔斯
我想在 UITextField 成为 firstResponder 时更改它的背景图像,以向用户显示它具有焦点,类似于 CSS 中的 :active 或 :focus 伪类。
我猜我可能需要以编程方式执行此操作;所以非常感谢任何帮助。
-贾尔斯
恕我直言,最干净的方法是子类化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;
}
您不妨使用 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 属性控制的标准外观。背景图像绘制在图像的边框矩形部分。您用于文本字段背景的图像应该能够拉伸以适应。
斯威夫特 4
textField.addTarget(self, action: #selector(anyFunction), for: UIControlEvents.editingDidBegin)
@objc func anyFunction() {
// Add your conde here
}
您或许可以尝试观察 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
}
}