隐藏UITextField的游标
我正在使用一个带有UIPickerView
的UITextField
作为它的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
取消隐藏插入
这里有两个方法来取消隐藏的插入。
-
将文本字段的选定文本范围设置为文档的末尾。
UITextPosition *end = textField.endOfDocument; textField.selectedTextRange = [textField textRangeFromPosition:end toPosition:end];
-
要将插入符号保存在同一个位置,首先将文本字段的选定文本范围存储为实例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:
使用无cursorless
在CGRectZero
和其默认值之间切换的方法。
这导致了一个简单的界面,通过一个插入类别。 这在以下文件中演示。
简单地将它们放入并获得这个简单的界面的好处
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];
也可以从界面生成器中进行设置