自定义 UITextField 清除按钮

Posted

技术标签:

【中文标题】自定义 UITextField 清除按钮【英文标题】:Custom UITextField clear button 【发布时间】:2012-02-11 10:00:47 【问题描述】:

是否可以在UITextField 中自定义清除按钮的图像?我的文本字段背景较暗,“x”不够明显。

【问题讨论】:

你能举个例子说明你是怎么做到的吗? 这是 Swift 3 中的 link to my solution。它应该可以满足您的目的。 【参考方案1】:

您可以将自己的自定义清除按钮设置为文本字段的rightView 属性。确保将rightViewMode 属性设置为UITextFieldViewModeWhileEditingUITextFieldViewModeAlways,只要对您的情况有意义。

如果按钮的位置不适合您的需要,您可以继承 UITextField 并覆盖 rightViewRectForBounds: 方法。

文档说clearButtonMode 属性的默认值为UITextFieldViewModeNever,但我怀疑Interface Builder 可能会将其设置为UITextFieldViewModeWhileEditing - 请确保将其设置为“从不”值,这样它就不会出现。

所有这些属性都记录在UITextField Class Reference 中。

【讨论】:

这应该比 Sebastian 提议的继承 UITextField 更容易。 注意:rightViewModeclearButtonMode 似乎有 UITextFieldViewModeAlways 的行为不同。当字段为空白时,后者不会显示视图,而前者会。 rightView 属性将只是一个视图。您仍然必须添加一个 UIButton 并实现您自己的 clear 方法。 令人惊讶的是,一个 7 岁的答案可以帮助我。谢谢你。当前 swift 的 rightViewRectForBounds 变为 override func rightViewRect( forBounds bounds: CGRect ) -> CGRect @Jason 太好了,七年后很高兴能提供帮助! :)【参考方案2】:

您可以使用 KVO 访问该属性:

UIButton *clearButton = [myTextField valueForKey:@"_clearButton"];
[clearButton setImage:[UIImage new] forState:UIControlStateNormal];

【讨论】:

顺利!苹果喜欢这样的东西吗?因为到目前为止我看到的所有其他解决方案都涉及在视图中创建一个新按钮并将其设置为 uitextfield 上的右视图 @MaximilianKörner 我使用这个和其他 KVO-s 来访问我们应用程序中不可访问的属性,并且它没有任何问题地发布到商店。 使用它有风险,因为它可能会在未来的操作系统版本中中断。我以前被咬过。 绝对糟糕的主意。我们曾经在 UIAlertViews 上做这样的事情来访问按钮。当苹果改变他们的实施时,所有应用内购买停止工作,我们只剩下数周的“修复工作” I still prefer KVO an Apple UI element than implementing a custom objects whats also going to break after time. - 至少在记录的功能发生更改时,更改本身会记录在案。这意味着您可以它们对您的用户造成破坏之前进行任何必要的更改。【参考方案3】:

已测试 iOS7.0 - 8.4

可以使用以下 UIAppearance 方法更新所有清除按钮的 backgroundImage。很遗憾,您无法更新按钮的图像:

UIButton *defaultClearButton = [UIButton appearanceWhenContainedIn:[UITextField class], nil];
[defaultClearButton setBackgroundImage:[UIImage imageNamed:@"clearButtonBkg1.png"] forState:UIControlStateNormal];

使用以下图像,这会产生以下清除按钮:

白色背景图片@3x:

注意:这将更新文本字段中包含的所有按钮的背景图像

【讨论】:

【参考方案4】:

Swift 2.2+ / ios 9+ 版本的@Brody Robertson 的回答:

let defaultClearButton = UIButton.appearanceWhenContainedInInstancesOfClasses([UITextField.self])
defaultClearButton.setBackgroundImage(UIImage(named: "ClearIcon"), forState: UIControlState.Normal)

【讨论】:

【参考方案5】:

斯威夫特 3

let customClearButton = UIButton.appearance(whenContainedInInstancesOf: [UITextField.self])
customClearButton.setBackgroundImage(UIImage(named: "custom_cb"), for: .normal)

【讨论】:

【参考方案6】:

取决于@Tuss László 的answer

斯威夫特 3.0

myTextField.clearButtonMode = .whileEditing
if let clearButton = myTextField.value(forKeyPath: "_clearButton") as? UIButton 
    clearButton.setImage(UIImage(named:"myImage"), for: .normal)
    clearButton.setImage(UIImage(named:"myImage"), for: .highlighted)

但真的要小心使用。如果 Apple 在未来的 iOS 版本中更改实现,它将无法正常工作

【讨论】:

使用私有 API 是不行的!【参考方案7】:

一种方法是创建一个自定义UITextField,将您想要的图像作为子视图,并在点击时清除父文本字段。您禁用默认按钮并在此自定义文本字段中添加自定义行为。

这应该可以帮助您入门。如果有任何更具体的问题,请随时编辑您的问题或在此处发表评论(如果是小问题)。

【讨论】:

以上是关于自定义 UITextField 清除按钮的主要内容,如果未能解决你的问题,请参考以下文章

您可以在自己的自定义控件中重用 UITextField 中的“清除”按钮图形(其中带有“x”的圆圈)吗?

自定义清除按钮

使用自定义 UITableViewCell 时在编辑之前更改 UITextField 文本

需要在自定义 UITextField 中调用 shouldChangeCharactersInRange 并调用视图控制器函数通知更新

布局 UITextField 无论清除按钮 X

UITextField 清除按钮调用 didEndEditing 两次