UITextField rightView 图像和按钮?
UITextField rightView image and button?
我在使用 UITextView
时遇到了 2 个问题。我有一个 UIViewController
有 5 UITextField
。 UITextField1
和 UITextField2
始终可见,用户无法隐藏。如果用户点击一个按钮,它会添加(isHidden
属性 设置为 false
)最多 3 个 UITextFields
。
每个 UITextFields
都应显示为 .rightView
显示左侧字符的自定义 UILabel
。除此之外,另外 3 个 UITextFields
还应该添加一个 .rightView
一个 UIButton
,当它被点击时它应该动画 textField.isHidden = true
这样它就会产生它删除的错觉UITextField
.
问题
右视图的删除UIButton
不起作用(即不隐藏相应的UITextField
,我不确定为什么。现在当你点击删除UIButton
它隐藏了奇怪的按钮本身
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.count + string.count - range.length
let rightView = UIView(frame: CGRect(x: 0, y: 0, width: 55, height: 25))
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
label.font = UIFont(name: Fonts.OpenSans_Light, size: 14)
if textField === thirdChoiceTextField || textField === forthChoiceTextField || textField === fifthChoiceTextField {
let button = UIButton(frame: CGRect(x: rightView.frame.width - 30, y: 0, width: 25, height: 25))
button.setBackgroundImage(UIImage(named: "icon_cancel_dark"), for: .normal)
button.addTarget(self, action: #selector(self.hideTextField(textField:)), for: .touchUpInside)
rightView.addSubview(button)
}
rightView.addSubview(label)
textField.rightView = rightView
textField.rightViewMode = .whileEditing
label.textAlignment = .center
if newLength <= 35 {
label.text = String(50 - newLength)
label.textColor = .lightGray
}
else {
label.text = String(50 - newLength)
label.textColor = UIColor.red
}
return newLength < 50
}
@objc func hideTextField(textField: UITextField) {
if !textField.isHidden {
UIView.animate(withDuration: 0.2) {
textField.isHidden = true
}
}
}
在func hideTextField(textField: UITextField)
方法中,参数不应该是UITextField
,它应该是UIButton
本身,如下所示,
@objc func hideTextField(_ sender: UIButton) {
...
}
和下一行
button.addTarget(self, action: #selector(self.hideTextField(textField:)), for: .touchUpInside)
将更改为
button.addTarget(self, action: #selector(self.hideTextField(_:)), for: .touchUpInside)
现在您可以应用如下动画了,
@objc func hideTextField(_ sender: UIButton) {
if let field = sender.superview?.superview as? UITextField, !field.isHidden {
UIView.animate(withDuration: 0.2) {
field.isHidden = true
}
}
}
我在使用 UITextView
时遇到了 2 个问题。我有一个 UIViewController
有 5 UITextField
。 UITextField1
和 UITextField2
始终可见,用户无法隐藏。如果用户点击一个按钮,它会添加(isHidden
属性 设置为 false
)最多 3 个 UITextFields
。
每个 UITextFields
都应显示为 .rightView
显示左侧字符的自定义 UILabel
。除此之外,另外 3 个 UITextFields
还应该添加一个 .rightView
一个 UIButton
,当它被点击时它应该动画 textField.isHidden = true
这样它就会产生它删除的错觉UITextField
.
问题
右视图的删除UIButton
不起作用(即不隐藏相应的UITextField
,我不确定为什么。现在当你点击删除UIButton
它隐藏了奇怪的按钮本身
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.count + string.count - range.length
let rightView = UIView(frame: CGRect(x: 0, y: 0, width: 55, height: 25))
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
label.font = UIFont(name: Fonts.OpenSans_Light, size: 14)
if textField === thirdChoiceTextField || textField === forthChoiceTextField || textField === fifthChoiceTextField {
let button = UIButton(frame: CGRect(x: rightView.frame.width - 30, y: 0, width: 25, height: 25))
button.setBackgroundImage(UIImage(named: "icon_cancel_dark"), for: .normal)
button.addTarget(self, action: #selector(self.hideTextField(textField:)), for: .touchUpInside)
rightView.addSubview(button)
}
rightView.addSubview(label)
textField.rightView = rightView
textField.rightViewMode = .whileEditing
label.textAlignment = .center
if newLength <= 35 {
label.text = String(50 - newLength)
label.textColor = .lightGray
}
else {
label.text = String(50 - newLength)
label.textColor = UIColor.red
}
return newLength < 50
}
@objc func hideTextField(textField: UITextField) {
if !textField.isHidden {
UIView.animate(withDuration: 0.2) {
textField.isHidden = true
}
}
}
在func hideTextField(textField: UITextField)
方法中,参数不应该是UITextField
,它应该是UIButton
本身,如下所示,
@objc func hideTextField(_ sender: UIButton) {
...
}
和下一行
button.addTarget(self, action: #selector(self.hideTextField(textField:)), for: .touchUpInside)
将更改为
button.addTarget(self, action: #selector(self.hideTextField(_:)), for: .touchUpInside)
现在您可以应用如下动画了,
@objc func hideTextField(_ sender: UIButton) {
if let field = sender.superview?.superview as? UITextField, !field.isHidden {
UIView.animate(withDuration: 0.2) {
field.isHidden = true
}
}
}