Скрыть курсор UITextField - PullRequest
       14

Скрыть курсор UITextField

115 голосов
/ 13 сентября 2010

Я использую UITextField с UIPickerView для его inputView, поэтому, когда пользователь нажимает на текстовое поле, вызывается средство выбора для выбора варианта из.

Почтивсе работает, но у меня есть одна проблема: курсор все еще мигает в текстовом поле, когда оно активно, что некрасиво и неуместно, поскольку пользователь не должен вводить данные в поле и не представлен с помощью клавиатуры.Я знаю, что мог бы решительно решить эту проблему, установив editing в NO в текстовом поле и отслеживая его касания, или заменив его кнопкой с пользовательским стилем, и вызвав сборщик с помощью кода.Однако я хочу использовать методы UITextFieldDelegate для всей обработки событий в текстовом поле, и такие хаки, как замена текстового поля кнопкой, не допускают такой подход.

Как я могу просто скрыть курсорна UITextField вместо?

Ответы [ 13 ]

253 голосов
/ 01 декабря 2012

Просто создайте подкласс UITextField и переопределите caretRectForPosition

- (CGRect)caretRectForPosition:(UITextPosition *)position
{
    return CGRectZero;
}
148 голосов
/ 20 ноября 2013

Начиная с iOS 7, теперь вы можете просто установить tintColor = [UIColor clearColor] на textField, и курсор исчезнет.

82 голосов
/ 01 мая 2015

Вы можете просто очистить текстовое поле tintColor

self.textField.tintColor = [UIColor clearColor];

Swift 3.0

self.textField.tintColor = .clear

enter image description here

20 голосов
/ 09 октября 2014

Возможно, вы также захотите запретить пользователю выбирать, копировать или вставлять любой текст, чтобы единственный текстовый ввод исходил из представления средства выбора.

- (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/

12 голосов
/ 01 марта 2013

Проверьте свойство selectedTextRange протокола UITextInput, к которому класс UITextField соответствует. Мало! Это урок в объектно-ориентированном программировании.

Скрыть каретку

Чтобы скрыть курсор, обнулите выделенный текстовый диапазон текстового поля.

textField.selectedTextRange = nil; // hides caret

Unhide Caret

Вот два способа показать каретку.

  1. Установить выбранный текстовый диапазон текстового поля в конец документа.

    UITextPosition *end = textField.endOfDocument;
    textField.selectedTextRange = [textField textRangeFromPosition:end
                                                        toPosition:end];
    
  2. Чтобы сохранить курсор в том же месте, сначала сохраните выбранный текстовый диапазон текстового поля в переменной экземпляра.

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

    Затем, когда вы хотите отобразить каретку, просто установите выбранный текстовый диапазон текстового поля обратно на то, что было изначально:

    textField.selectedTextRange     = _textFieldSelectedTextRange;
    _textFieldLastSelectedTextRange = nil;
    
10 голосов
/ 24 ноября 2010

Ответ, предоставленный ФП, скопирован из тела вопроса, чтобы помочь очистить постоянно растущий хвост неотвеченных вопросов.

Я нашел другое решение: подкласс UIButton и переопределил эти методы

- (UIView *)inputView {
    return inputView_;
}

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

- (BOOL)canBecomeFirstResponder {
    return YES;
}

Теперь кнопка, как UIResponder, ведет себя аналогично UITextField, а реализация довольно проста.

5 голосов
/ 09 марта 2017

Swift 3 версия поста Net

  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
  }
1 голос
/ 11 октября 2017

установите для параметра tintColor значение Clear Color

textfield.tintColor = [UIColor clearColor];

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

1 голос
/ 15 сентября 2014

Чтобы отключить курсор и меню, я использую подкласс с этими двумя методами:

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

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    [UIMenuController sharedMenuController].menuVisible = NO;
    self.selectedTextRange = nil;

    return NO;
}
1 голос
/ 24 сентября 2013

Если вы хотите скрыть курсор, вы можете легко использовать это!У меня это сработало ..

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