Скрыть курсор UITextField
Я использую UITextField
с UIPickerView
для своего inputView
, так что, когда пользователь отбирает текстовое поле, для них выбирается выборщик для выбора опции.
Почти все работает, но у меня есть одна проблема: курсор все еще мигает в текстовом поле, когда он активен, что является уродливым и неуместным, так как пользователь не должен вводить в поле и не отображается с клавиатурой, Я знаю, что я мог бы взломать это решение, установив editing
в NO
в текстовое поле и отслеживая его касание, или заменив его кнопкой пользовательского стиля и вызывая сборщик по коду. Тем не менее, я хочу использовать методы UITextFieldDelegate
для всей обработки событий в текстовом поле, а хаки, такие как замена текстового поля кнопкой, не позволяют этого подхода.
Как я могу просто скрыть курсор на UITextField
вместо?
Ответы
Ответ 1
Ответ, предоставленный OP, скопированный из органа вопросов, чтобы помочь очистить постоянно растущий хвост нерешенных вопросов.
Я нашел другое решение: подкласс UIButton
и переопределить эти методы
- (UIView *)inputView {
return inputView_;
}
- (void)setInputView:(UIView *)anInputView {
if (inputView_ != anInputView) {
[inputView_ release];
inputView_ = [anInputView retain];
}
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
Теперь кнопка, как UIResponder
, имеет аналогичное поведение, чем UITextField
, и реализация довольно проста.
Ответ 2
Просто подкласс UITextField и переопределить caretRectForPosition
- (CGRect)caretRectForPosition:(UITextPosition *)position
{
return CGRectZero;
}
Ответ 3
Как и в iOS 7, теперь вы можете просто установить tintColor = [UIColor clearColor]
на textField, и каретка исчезнет.
Ответ 4
Вы можете просто очистить текстовое поле tintColor
self.textField.tintColor = [UIColor clearColor];
Swift 3.0
self.textField.tintColor = .clear
![enter image description here]()
Ответ 5
Вы также можете запретить пользователю выбирать, копировать или вставлять любой текст, чтобы только текстовый ввод поступал из представления выбора.
- (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/
Ответ 6
Отъезд свойства selectedTextRange
протокола UITextInput
, которому класс UITextField
соответствует. Мало! Это урок в объектно-ориентированном программировании прямо там.
Скрыть Caret
Чтобы скрыть каретку, выберите нужный текстовый диапазон в текстовом поле.
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;
Ответ 7
Ответ, предоставленный OP, скопированный из органа вопросов, чтобы помочь очистить постоянно растущий хвост нерешенных вопросов.
Я думаю, что у меня есть правильное решение, но если его можно улучшить, это будет приветствовать:) Ну, я создал подкласс UITextField и переопределяет метод, возвращающий CGRect для границ
-(CGRect)textRectForBounds:(CGRect)bounds {
return CGRectZero;
}
Проблема? Текст не отображается, поскольку прямоугольник равен нулю. Но я добавил UILabel в качестве подчиненного элемента управления и переопределил метод setText, поэтому, когда мы вводим текст как обычно, текст текстового поля равен nil и является меткой, отображающей текст
- (void)setText:(NSString *)aText {
[super setText:nil];
if (aText == nil) {
textLabel_.text = nil;
}
if (![aText isEqualToString:@""]) {
textLabel_.text = aText;
}
}
С этим все работает так, как ожидалось. Знаете ли вы, как улучшить его?
Ответ 8
Если вы хотите скрыть курсор, вы можете легко использовать это! Это сработало для меня.
[[textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]
Ответ 9
Чтобы отключить курсор и меню, я использую подкласс с этими двумя методами:
- (CGRect)caretRectForPosition:(UITextPosition *)position {
return CGRectZero;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
[UIMenuController sharedMenuController].menuVisible = NO;
self.selectedTextRange = nil;
return NO;
}
Ответ 10
Я просто подклассом UITextField
и переопределяю layoutSubviews
следующим образом:
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *v in self.subviews)
{
if ([[[v class] description] rangeOfString:@"UITextSelectionView"].location != NSNotFound)
{
v.hidden = YES;
}
}
}
Это грязный взломать и может не сработать в будущем (после чего курсор будет снова виден - ваше приложение не будет разбиваться), но оно работает.
Ответ 11
Свифт 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
}
Ответ 12
Вы можете добавить свойство BOOL cursorless
в UITextField
в категории через связанные объекты.
@interface UITextField (Cursorless)
@property (nonatomic, assign) BOOL cursorless;
@end
Затем используйте метод swizzling для 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
Ответ 13
установите цвет tintColor для очистки цвета
textfield.tintColor = [UIColor clearColor];
и вы также можете установить его из конструктора интерфейса