Предотвратете редактирането на текст в 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 [textField gestureRecognizers] -› нула - 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
Това ми изглежда подозрително! Използвайте отговора на Walapu. - 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, освен ако не внедрите и 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