编辑开始时更改 UITextField 背景

Posted

技术标签:

【中文标题】编辑开始时更改 UITextField 背景【英文标题】:Change UITextField background when editing begins 【发布时间】:2010-01-03 01:31:34 【问题描述】:

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

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

-贾尔斯

【问题讨论】:

【参考方案1】:

恕我直言,最简洁的方法是继承 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;

【讨论】:

最干净是主观的,组合的支持者对最干净的溶液有不同的口味。【参考方案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 背景的主要内容,如果未能解决你的问题,请参考以下文章

UITextField在开始编辑时具有“清除”按钮大小

动态更改 UITextField 宽度取决于内容

UITextField 在编辑时更改字体

编辑时如何更改 UITextField

在uitextfield中编辑文本时如何调用函数

编辑时更改 uitextfield 返回键类型