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

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

Настройка userInteractionEnabled на NO не работает, потому что она больше не получает никаких касаний и не будет отображать клавиатуру.

Ответы

Ответ 1

Подкласс 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.

Ответ 2

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

textField.tintColor = [UIColor clearColor];

Ответ 3

Надеюсь, это поможет вам.

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

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

Ответ 4

Я нашел лучшее решение

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

Ответ 5

Чтобы иметь 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, например, и затем можете переключать статус первогоResponder с помощью tableView:didSelectRowAtIndexPath:.

Ответ 6

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

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