隐藏UITextField的游标

我正在使用一个带有UIPickerViewUITextField作为它的inputView ,这样当用户点击文本字段时,一个select器会被召唤出来供他们从中select一个选项。

几乎一切正常,但我有一个问题:当它处于活动状态时,光标在文本字段中仍然闪烁,这是丑陋的和不恰当的,因为用户不需要键入字段,也不会显示键盘。 我知道我可以通过在文本字段上将editing设置为NO并对其进行跟踪来解决这个问题,或者用一个自定义样式的buttonreplace它,然后通过代码召唤select器。 但是,我想使用UITextFieldDelegate方法处理文本字段上的所有事件,并且使用buttonreplace文本字段等攻击不允许使用此方法。

我怎样才能简单地将光标隐藏在UITextField

由OP提供的答案,从问题主体中复制,以帮助清理不断增长的未解决问题的尾部。

我发现另一个解决scheme:子类UIButton并重写这些方法

 - (UIView *)inputView { return inputView_; } - (void)setInputView:(UIView *)anInputView { if (inputView_ != anInputView) { [inputView_ release]; inputView_ = [anInputView retain]; } } - (BOOL)canBecomeFirstResponder { return YES; } 

现在,button作为UIResponder ,具有与UITextField相似的行为,并且实现非常简单。

简单地inheritanceUITextField并覆盖caretRectForPosition

 - (CGRect)caretRectForPosition:(UITextPosition *)position { return CGRectZero; } 

从iOS 7开始,您现在只需在textField上设置tintColor = [UIColor clearColor] ,脱字符号就会消失。

你可以清除textfield的tintColor

 self.textField.tintColor = [UIColor clearColor]; 

Swift 3.0

 self.textField.tintColor = .clear 

在这里输入图像说明

您可能还想停止用户select,复制或粘贴任何文本,以便唯一的文本input来自select器视图。

 - (CGRect) caretRectForPosition:(UITextPosition*) position { return CGRectZero; } - (NSArray *)selectionRectsForRange:(UITextRange *)range { return nil; } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:)) { returnNO; } return [super canPerformAction:action withSender:sender]; } 

http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

查看协议 UITextInput属性 selectedTextRange UITextField符合。 很less! 这是面向对象编程的一个教训。

Hide Caret

要隐藏插入符号,请删除文本字段的选定文本范围。

 textField.selectedTextRange = nil; // hides caret 

取消隐藏插入

这里有两个方法来取消隐藏的插入。

  1. 将文本字段的选定文本范围设置为文档的末尾。

     UITextPosition *end = textField.endOfDocument; textField.selectedTextRange = [textField textRangeFromPosition:end toPosition:end]; 
  2. 要将插入符号保存在同一个位置,首先将文本字段的选定文本范围存储为实例variables。

     _textFieldSelectedTextRange = textField.selectedTextRange; textField.selectedTextRange = nil; // hides caret 

    然后,当您要取消隐藏插入符时,只需将文本字段的选定文本范围设置回原来的位置即可:

     textField.selectedTextRange = _textFieldSelectedTextRange; _textFieldLastSelectedTextRange = nil; 

由OP提供的答案,从问题主体中复制,以帮助清理不断增长的未解决问题的尾部。

我认为我有正确的解决scheme,但如果可以改善将欢迎:)那么,我做了UITextField的子类,并重写了返回CGRect的边界的方法

 -(CGRect)textRectForBounds:(CGRect)bounds { return CGRectZero; } 

问题? 文字不显示,因为矩形为零。 但是我添加了一个UILabel作为控件的子视图,并重写了setText方法,所以当我们像往常一样input文本时,文本字段文本是nil,并且是显示文本的标签

 - (void)setText:(NSString *)aText { [super setText:nil]; if (aText == nil) { textLabel_.text = nil; } if (![aText isEqualToString:@""]) { textLabel_.text = aText; } } 

有了这个东西按预期工作。 你知道有什么办法来改善它吗?

如果你想隐藏光标,你可以很容易地使用这个! 它为我工作..

 [[textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"] 

要禁用游标和菜单我使用这两种方法的子类:

 - (CGRect)caretRectForPosition:(UITextPosition *)position { return CGRectZero; } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { [UIMenuController sharedMenuController].menuVisible = NO; self.selectedTextRange = nil; return NO; } 

我只是子类UITextField ,并重写layoutSubviews如下:

 - (void)layoutSubviews { [super layoutSubviews]; for (UIView *v in self.subviews) { if ([[[v class] description] rangeOfString:@"UITextSelectionView"].location != NSNotFound) { v.hidden = YES; } } } 

这是一个肮脏的黑客,将来可能会失败(在这一点上光标将再次可见 – 你的应用程序不会崩溃),但它的工作原理。

Swift 3的Net的post

  override func caretRect(for position: UITextPosition) -> CGRect { return .zero } override func selectionRects(for range: UITextRange) -> [Any] { return [] } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return false } 

您可以通过关联的对象将一个BOOL cursorless属性添加到一个类别的UITextField中。

 @interface UITextField (Cursorless) @property (nonatomic, assign) BOOL cursorless; @end 

然后使用caretRectForPosition:方法caretRectForPosition:使用无cursorlessCGRectZero和其默认值之间切换的方法。

这导致了一个简单的界面,通过一个插入类别。 这在以下文件中演示。

简单地将它们放入并获得这个简单的界面的好处

UITextField类别: https : //github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField%2BRXCursorless.h https://github.com/rexmas/RexDK/blob/master/RexDK/UI/UITextField% 2BRXCursorless.m

方法Swizzling: https : //github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject%2BRXRuntimeAdditions.h https://github.com/rexmas/RexDK/blob/master/RexDK/Foundation/NSObject% 2BRXRuntimeAdditions.m

设置tintColor为清除颜色

 textfield.tintColor = [UIColor clearColor]; 

也可以从界面生成器中进行设置