Запретить редактирование текста в UITextField и скрыть курсор/каретку/увеличительное стекло при использовании inputView

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

Установка userInteractionEnabled на NO не работает, так как больше не принимает касания и не будет представлять клавиатуру.


person Josh Bernfeld    schedule 09.08.2013    source источник


Ответы (6)


Подкласс UITextField

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

//Disables magnifying glass
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
    {
        gestureRecognizer.enabled = NO;
    }
    [super addGestureRecognizer:gestureRecognizer];
}

В вашем UITextFieldDelegate

//Prevent text from being copied and pasted or edited with bluetooth keyboard.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    return NO;
}

Теперь просто установите текст программно из результата вашего UIPickerView/UIDatePicker.

person Josh Bernfeld    schedule 09.08.2013
comment
Отсутствуют распознаватели жестов (iOS 8): (lldb) po [textFieldgestRecognizers] -> nil - person Adam Kaplan; 28.12.2015

Скрытие курсора в iOS 7 стало намного проще. Чтобы отключить лупу, все еще нужны хитрости.

textField.tintColor = [UIColor clearColor];
person Chris Wagner    schedule 06.11.2013
comment
До сих пор не знаю, почему настройка tintColor из раскадровки не действует, хотя код работает. - person samthui7; 03.11.2016

Я надеюсь, что это будет полезно для вас.

Установите курсор UIColor -> Empty. В пользовательском интерфейсе он будет скрыт.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"];
person Balaji G    schedule 17.08.2013
comment
это официальный путь к этому? Я думаю, что это манипуляция с частным API Apple. - person carmen_munich; 20.09.2013
comment
Мне это кажется подозрительным! Используйте ответ Валапу. - person Adam Waite; 29.10.2013

Я нашел лучшее решение было

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

person Nat    schedule 09.10.2014
comment
Это работает, но вы все равно можете щелкнуть и ввести текстовое поле, если вы также не реализуете textField:shouldChangeCharactersInRange:replacementString: в соответствии с ответом Walapu. - person Brett Donald; 17.03.2015

Чтобы иметь UITextField без взаимодействия, но при этом работать с inputView:

Подкласс UITextField со следующими методами:

// Hide the cursor
- (CGRect)caretRectForPosition:(UITextPosition*)position
{
    return CGRectZero;
}

// All touches inside will be ignored
// and intercepted by the superview
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return NO;
}

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

Это отлично работает, если вы используете текстовое поле, например, в UITableViewCell, а затем можете переключать статус firstResponder через tableView:didSelectRowAtIndexPath:.

person Kris    schedule 25.04.2015

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

- (IBAction)btnEditPhoneTapped:(id)sender
{
    if (self.tfClientPhoneNo.isFirstResponder == NO) [self.tfClientPhoneNo becomeFirstResponder];
}
person Dannie P    schedule 30.05.2014