【发布时间】:2012-02-11 10:00:47
【问题描述】:
是否可以在UITextField 中自定义清除按钮的图像?我的文本字段背景较暗,“x”不够明显。
【问题讨论】:
-
你能举个例子说明你是怎么做到的吗?
-
这是 Swift 3 中的 link to my solution。它应该可以满足您的目的。
标签: objective-c ios uitextfield
是否可以在UITextField 中自定义清除按钮的图像?我的文本字段背景较暗,“x”不够明显。
【问题讨论】:
标签: objective-c ios uitextfield
您可以将自己的自定义清除按钮设置为文本字段的rightView 属性。确保将rightViewMode 属性设置为UITextFieldViewModeWhileEditing 或UITextFieldViewModeAlways,只要对您的情况有意义。
如果按钮的位置不适合您的需要,您可以继承 UITextField 并覆盖 rightViewRectForBounds: 方法。
文档说clearButtonMode 属性的默认值为UITextFieldViewModeNever,但我怀疑Interface Builder 可能会将其设置为UITextFieldViewModeWhileEditing - 请确保将其设置为“从不”值,这样它就不会出现。
所有这些属性都记录在UITextField Class Reference 中。
【讨论】:
rightViewMode 和 clearButtonMode 似乎有 UITextFieldViewModeAlways 的行为不同。当字段为空白时,后者不会显示视图,而前者会。
您可以使用 KVO 访问该属性:
UIButton *clearButton = [myTextField valueForKey:@"_clearButton"];
[clearButton setImage:[UIImage new] forState:UIControlStateNormal];
【讨论】:
I still prefer KVO an Apple UI element than implementing a custom objects whats also going to break after time. - 至少在记录的功能发生更改时,更改本身会记录在案。这意味着您可以在它们对您的用户造成破坏之前进行任何必要的更改。
已测试 iOS7.0 - 8.4
可以使用以下 UIAppearance 方法更新所有清除按钮的 backgroundImage。很遗憾,您无法更新按钮的图像:
UIButton *defaultClearButton = [UIButton appearanceWhenContainedIn:[UITextField class], nil];
[defaultClearButton setBackgroundImage:[UIImage imageNamed:@"clearButtonBkg1.png"] forState:UIControlStateNormal];
使用以下图像,这会产生以下清除按钮:
白色背景图片@3x:
注意:这将更新文本字段中包含的所有按钮的背景图像
【讨论】:
Swift 2.2+ / iOS 9+ 版本的@Brody Robertson 的回答:
let defaultClearButton = UIButton.appearanceWhenContainedInInstancesOfClasses([UITextField.self])
defaultClearButton.setBackgroundImage(UIImage(named: "ClearIcon"), forState: UIControlState.Normal)
【讨论】:
斯威夫特 3
let customClearButton = UIButton.appearance(whenContainedInInstancesOf: [UITextField.self])
customClearButton.setBackgroundImage(UIImage(named: "custom_cb"), for: .normal)
【讨论】:
取决于@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 版本中更改实现,它将无法正常工作
【讨论】:
一种方法是创建一个自定义UITextField,将您想要的图像作为子视图,并在点击时清除父文本字段。您禁用默认按钮并在此自定义文本字段中添加自定义行为。
这应该可以帮助您入门。如果有任何更具体的问题,请随时编辑您的问题或在此处发表评论(如果是小问题)。
【讨论】: