Спрятать курсор в поле UITextField
Я использую UITextField с UIPickerView для своего inputView, Так что, когда пользователь нажимает на текстовое поле, выбор вызван для них, чтобы выбрать из.
почти все работает, но у меня есть одна проблема: курсор все еще мигает в текстовом поле, когда он активен, что некрасиво и неуместно, так как пользователь не должен вводить в поле и не представлен клавиатурой. Я знаю, что могу хакерски решить эту проблему, установив editing до NO текст поле и отслеживание касаются его, или заменяя его кнопкой в пользовательском стиле и вызывая сборщика с помощью кода. Однако, я хочу использовать UITextFieldDelegate методы для обработки событий на текстовом поле и хаки, такие как замена текстового поля с помощью кнопки не допускают такой подход.
как я могу просто скрыть курсор на UITextField вместо этого?
13 ответов:
просто подкласс UITextField и переопределить caretRectForPosition
- (CGRect)caretRectForPosition:(UITextPosition *)position { return CGRectZero; }
начиная с iOS 7 Теперь вы можете просто установить
tintColor = [UIColor clearColor]на текстовом поле и каретка исчезнет.
вы можете просто очистить tintColor текстового поля
self.textField.tintColor = [UIColor clearColor];Swift 3.0
self.textField.tintColor = .clear
вы также можете запретить пользователю выбирать, копировать или вставлять любой текст, чтобы единственный ввод текста происходил из представления выбора.
- (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/
Проверьте свойства
selectedTextRangeна протоколUITextInput, в котором классUITextFieldсоответствует. Мало! Это урок объектно-ориентированного программирования прямо там.Скрыть Каре
чтобы скрыть курсор, обнулите диапазон выделенного текста текстового поля.
textField.selectedTextRange = nil; // hides caretОтобразить Каре
вот два способа отображения знак вставки.
установите выбранный диапазон текста в конце документа.
UITextPosition *end = textField.endOfDocument; textField.selectedTextRange = [textField textRangeFromPosition:end toPosition:end];чтобы сохранить курсор в том же месте, сначала сохраните выбранный диапазон текста текстового поля в переменной экземпляра.
_textFieldSelectedTextRange = textField.selectedTextRange; textField.selectedTextRange = nil; // hides caretзатем, когда вы хотите отобразить курсор, просто установите выбранный диапазон текста текстового поля обратно в исходное состояние:
textField.selectedTextRange = _textFieldSelectedTextRange; _textFieldLastSelectedTextRange = nil;
ответ, предоставленный OP, скопирован из тела вопроса, чтобы помочь очистить постоянно растущий хвост неотвеченных вопросов.
Я нашел другое решение: подкласс
UIButtonи переопределить эти методы- (UIView *)inputView { return inputView_; } - (void)setInputView:(UIView *)anInputView { if (inputView_ != anInputView) { [inputView_ release]; inputView_ = [anInputView retain]; } } - (BOOL)canBecomeFirstResponder { return YES; }теперь кнопка, как
UIResponder, имеют аналогичное поведение, чемUITextFieldи реализация довольно проста.
Swift 3 версия сообщения сети
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 }
ответ, предоставленный OP, скопирован из тела вопроса, чтобы помочь очистить постоянно растущий хвост неотвеченных вопросов.
Я думаю, что у меня есть правильное решение, но если его можно улучшить, будет приветствоваться :) Ну, я сделал подкласс UITextField и переопределил метод, который возвращает CGRect для границ
-(CGRect)textRectForBounds:(CGRect)bounds { return CGRectZero; }проблема? Текст не отображается, потому что прямая равна нулю. Но я добавил UILabel в качестве подвида элемента управления и переопределите метод setText так, как мы вводим текст как обычно, текстовое поле text равно 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"]
для отключения курсора и меню я использую подкласс с этими 2 методами:
- (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; } } }это грязный хак, и может потерпеть неудачу в будущем (в этот момент курсор будет виден снова - ваше приложение не рухнет), но он работает.
установите tintColor для очистки цвета
textfield.tintColor = [UIColor clearColor];и вы также можете установить с интерфейсом строитель
вы можете добавить
BOOL cursorlessсвойствоUITextFieldв категории через связанные объекты.@interface UITextField (Cursorless) @property (nonatomic, assign) BOOL cursorless; @endзатем используйте метод swizzling to swizzle
caretRectForPosition:С помощью метода, который переключается междуCGRectZeroи его значение по умолчанию с помощьюcursorless.это приводит к простому интерфейсу через выпадающую категорию. Это показано в следующих файлах.
просто бросьте их и получите преимущество этого простого интерфейса
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

Comments