162 votes

Masquer le curseur d'un UITextField

Je suis à l'aide d'un UITextField avec un UIPickerView pour son inputView, de sorte que lorsque l'utilisateur clique sur le champ de texte, un sélecteur est convoqué pour eux pour sélectionner une option.

Presque tout fonctionne, mais j'ai un problème: le curseur clignote dans le champ de texte lorsqu'il est actif, ce qui est laid et inapproprié, car l'utilisateur ne devrait pas taper dans le champ et n'est pas présenté avec un clavier. Je sais que je pourrais hackily résoudre ce problème en définissant editing de NO sur le champ de texte et de suivi de la touche, ou en la remplaçant par une coutume de style bouton, la convocation et le sélecteur via le code. Cependant, je veux utiliser l' UITextFieldDelegate méthodes pour tous les cas de manipulation sur le champ de texte et des hacks comme le remplacement du champ de texte avec un bouton ne permettent pas cette approche.

Comment puis-je cacher le curseur de la souris sur l' UITextField à la place?

286voto

Joseph Chiu Points 1171

Il suffit de sous-classer UITextField et de remplacer caretRectForPosition

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

171voto

jamone Points 6458

Depuis iOS 7, vous pouvez maintenant définir les tintColor = [UIColor clearColor] sur le champ textField et le curseur disparaîtra.

21voto

Nat Points 1

Vous pouvez également empêcher l'utilisateur de sélectionner, de copier ou de coller du texte de sorte que la seule saisie de texte provienne de la vue Sélecteur.

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

15voto

MattDiPasquale Points 23842

Découvrez les biens selectedTextRange du protocole UITextInput, à laquelle la classe UITextField conforme. Quelques! C'est une leçon orientée objet la programmation.

Masquer Le Curseur

Pour masquer le curseur, néant le texte du champ de texte sélectionné la gamme.

textField.selectedTextRange = nil; // hides caret

Afficher Caret

Voici deux façons d'afficher le curseur.

  1. Définir le texte du champ de texte sélectionné une plage à la fin du document.

    UITextPosition *end = textField.endOfDocument;
    textField.selectedTextRange = [textField textRangeFromPosition:end
                                                        toPosition:end];
    
  2. Pour garder le curseur au même endroit, d'abord, de stocker le texte du champ de texte sélectionné la gamme à une variable d'instance.

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

    Ensuite, lorsque vous souhaitez afficher le curseur, il suffit de définir le texte du champ de texte sélectionné plage à ce qu'il était à l'origine:

    textField.selectedTextRange     = _textFieldSelectedTextRange;
    _textFieldLastSelectedTextRange = nil;
    

11voto

Robert Höglund Points 5572

Réponse fournie par le PO, copiée à partir du corps de la question pour aider à nettoyer la queue toujours croissante de questions sans réponse.

J'ai trouvé une autre solution: la sous-classe UIButton et outrepasse ces méthodes

 - (UIView *)inputView {
    return inputView_;
}

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

- (BOOL)canBecomeFirstResponder {
    return YES;
}
 

Maintenant, le bouton, en tant que UIResponder , a un comportement similaire à celui de UITextField et une implémentation assez simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X