Спрятать курсор в поле UITextField



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



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



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

666   13  

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

enter image description here

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

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

Отобразить Каре

вот два способа отображения знак вставки.

  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;
    

ответ, предоставленный 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

    Ничего не найдено.