Скрыть курсор 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];

и вы также можете установить его из конструктора интерфейса