编辑开始时更改 UITextField 背景
Posted
技术标签:
【中文标题】编辑开始时更改 UITextField 背景【英文标题】:Change UITextField background when editing begins 【发布时间】:2010-01-03 01:31:34 【问题描述】:我想在 UITextField 成为 firstResponder 时更改其背景图像,以向用户显示它具有焦点,类似于 CSS 中的 :active 或 :focus 伪类。
我猜我可能需要以编程方式执行此操作;非常感谢任何帮助。
-贾尔斯
【问题讨论】:
【参考方案1】:恕我直言,最简洁的方法是继承 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;
【讨论】:
最干净是主观的,组合的支持者对最干净的溶液有不同的口味。【参考方案2】:您不妨使用 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(非原子,保留) UIImage *背景
讨论
设置时,所引用的图像 此属性取代标准 外观由控制 边框样式属性。背景 图像在边框中绘制 图像的矩形部分。图片 您用于文本字段的 背景应该可以拉伸 适合。
【讨论】:
感谢您提及borderStyle。这应该在 UITextField 的背景属性的文档中提到 我在您的文字中发现了一个错误。如果 UITextField 带有圆角,则它会忽略所有背景图像。反之亦然【参考方案3】:SWIFT 4
textField.addTarget(self, action: #selector(anyFunction), for: UIControlEvents.editingDidBegin)
@objc func anyFunction()
// Add your conde here
【讨论】:
【参考方案4】:您或许可以尝试观察 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
【讨论】:
我知道如何检查它何时成为 firstResponder 但我如何实际更改背景图像? 可以将textField的图层内容改为CGImage textField.layer.contents = myImage.CGImage;应该工作。以上是关于编辑开始时更改 UITextField 背景的主要内容,如果未能解决你的问题,请参考以下文章