隐藏UITextField中的选择句柄

时间:2014-04-04 17:21:13

标签: ios objective-c text uitextfield selection

我有UITextField插入一些文本并立即选择所有文本,因此用户可以单击关闭并接受预填充数据或键入任何其他内容并覆盖所有内容。我这称之为:

[myTextField setSelectedTextRange:[myTextField textRangeFromPosition:myTextField.beginningOfDocument toPosition:myTextField.endOfDocument]];

我想知道是否有隐藏选择文字的手柄(圆形手柄,一个左上角,一个右下角),因为它不符合我们的UI设计,并且他们没有目的。

3 个答案:

答案 0 :(得分:3)

我不相信在UITextField / UITextView中有一种原生方式可以做到这一点。您可能需要使用CoreText从头开始构建一些东西。

那就是说,为了实用性,将它们保留在那里可能是一个好主意?

或者,您可以通过向AttributedText添加NSBackgroundColorAttributeName并在用户按退格键时以编程方式清除它来“伪造”它?

答案 1 :(得分:0)

如果只是为了外观,您可以将UITextField子类化并覆盖:

- (void)setSelectedTextRange:(UITextRange *)selectedTextRange {
//
[super setSelectedTextRange:selectedTextRange];

self.tintColor = selectedTextRange.empty ? <default cursor color> : [UIColor clearColor];}

手柄仍然存在,只是不可见。

答案 2 :(得分:0)

这是一个简单的 Swift 3 解决方案,非常适合我。

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.delegate = self
        textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
    }

    // When editing starts, select all and then make handles (and cursor) invisible
    public func textFieldDidBeginEditing(_ textField: UITextField) {
        DispatchQueue.main.async {
            textField.selectAll(nil)
            textField.tintColor = .clear
        }
    }

    // If user types, restore cursor visibility  
    func textFieldDidChange(_ textField: UITextField) {
        DispatchQueue.main.async {
            textField.tintColor = .blue
        }
    }
}

注1:我最初没有将更改分发到主队列,但是我发现更改有时无法正确呈现。将分派添加到主队列后,我再也没有看到此行为。

注2:我真的很想使用UITextFieldDelegate的shouldChangeCharactersIn处理程序使光标再次可见,但是由于某些原因,当用户在textField中键入内容时,从未调用该方法。因此,我改用了.editingChanged事件,这似乎可以正常工作,但不太干净,恕我直言。如果有人知道为什么以下内容不能作为UITextFieldDelegate的一部分工作,请发表评论。谢谢!

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        textField.tintColor = .blue
        return true
    }