我想更改UITextField的背景图像,当它成为firstResponder以向用户显示它具有焦点时,类似于CSS中的:active或:focus伪类。
我猜我可能需要以编程方式执行此操作;所以非常感谢任何帮助。
-Giles
答案 0 :(得分: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(在这种情况下,不考虑background属性)时,此方法才有效。这意味着您可以将上面的代码与UITextBorderStyleBezel,UITextBorderStyleLine和UITextBorderStyleNone一起使用,如borderStyle文档中所述:
borderStyle
文本字段使用的边框样式。
@property(非原子)UITextBorderStyle borderStyle
讨论
此属性的默认值为 UITextBorderStyleNone。如果是自定义 背景图片设置,此属性 被忽略了。
这是UITextField的背景属性的文档:
背景
代表的图像 背景外观的文字 启用时的字段。
@property(非原子,保留)UIImage *背景
讨论
设置时,引用的图像 此属性取代了标准 外观受到控制 borderStyle属性。背景 图像在边框中绘制 图像的矩形部分。图片 你用于文本字段 背景应该能够伸展 适合。
答案 1 :(得分:27)
最简单的方法是恕我直言{@ 1}},并覆盖UITextField
和becomeFirstResponder
以更改文本字段的背景图片。这样,您可以在任何地方使用新的子类,而无需重新实现委托方法来更改背景。
resignFirstResponder
答案 2 :(得分:1)
SWIFT 4
textField.addTarget(self, action: #selector(anyFunction), for: UIControlEvents.editingDidBegin)
@objc func anyFunction() {
// Add your conde here
}
答案 3 :(得分: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
}
}