J'utilise un UITEXTVIEW pour reproduire approximativement la zone de texte SMS au-dessus du clavier. J'utilise un UITEXTVIEW au lieu d'un champ de manière à pouvoir se développer avec plusieurs lignes. P>
Le problème est que, dans mon uitextview, les suggestions de correction apparaissent Dans l'application SMS, les suggestions apparaissent au-dessus du texte. Le placement ne semble pas être une propriété de UITEXTVIEW ou UITEXTINUTTRAITITS. P>
Une idée de reproduire ce comportement? Merci! P>
7 Réponses :
Si le bas de votre UitextView efface le clavier, vous devriez pouvoir simplement redimensionner votre UitextView pour être suffisamment grande pour voir les corrections. Les corrections elles-mêmes ne s'affichent pas en dehors du cadre de l'UITEXTVIEW. P>
Si vous voulez imiter ce que vous entrez dans l'application SMS (Corrections ci-dessus), vous devrez probablement rouler votre propre. P>
Assurez-vous que votre délégué de contrôleur d'affichage écoute la notification lorsque le clavier apparaît afin de redimensionner votre UITEXTVIEW afin que le clavier ne masque pas l'UITEXTEXTVIEW. Ensuite, votre correction ne sera pas masquée par le clavier. Voir:
Voici une copie du code de cette page au cas où le Le lien d'origine est cassé: p>
Le problème est que le clavier est implémenté comme une uiwindow distinct plutôt que comme une vue dans l'UIwindow principal, alors la mise en page avec elle est délicate. Voici quelques pointeurs dans la bonne direction: P>
-WINDOWS CODE> DE L'APPLANCE Pour rechercher la fenêtre UITEXEFTECTWINDOW CODE> et déterminez son cadre. C'est le clavier li>
- Chasse dans les sous-visions de TextView pour trouver le
uautocorrecinlinepromppt code>. Ceci est la bulle d'autocorrie. LI>
- Déplacez cette sous-évaluation dans une vue d'enveloppe distincte (ajoutée à la TextView), puis déplacez-la de la vue d'emballage afin qu'elle soit au-dessus de la fenêtre du clavier mentionné ci-dessus. LI>
ul>
Vous remarquerez deux mentions de «privé» ci-dessus. Cela porte toutes les réserves pertinentes. Je ne sais pas pourquoi Apple a permis au problème de persister quand même leurs applications ont dû travailler autour de lui. P>
Je me demande ... est de traverser des sous-espions sans parler explicitement des classes privées considérées comme une violation? Je veux dire, je suppose qu'il étend uIView à droite? Et si je viens de chercher à l'arbre d'UIViews et de changer l'emplacement de l'un d'entre eux? Ne semble pas "privé" pour moi, mais peut-être que Apple n'est pas d'accord ...
Les sous-espages transversaux sont entièrement basés sur des API publiques. Mais peu importe ce que vous allez vous entendre sur un comportement sans papiers. Le danger principal ici est qu'une mise à jour pourrait vous briser, donc dans le code de production que je voudrais échouer gracieusement. Je ne considérerais pas l'une ou l'autre de ces sous-classes privées pour être fortement stable, car ils sont à la fois un peu funky, et des choses funky ont mangé le plus susceptible d'être repensé par Apple. Croyez-le ou non, Apple ne rend pas les choses privées juste pour être méchante :) Très souvent, ce sont les choses que Apple envisage de refracteur. Prenez-le pour ce que ça vaut la peine.
Par hasard avez-vous un exemple de code? Je suis curieux si vous avez utilisé la méthode Swizzling ou ce que vous avez peut-être fait pour mettre en œuvre cette ...
Malheureusement, je ne peux pas publier ce code, mais nous n'avons pas besoin de méthode Swizzling. Vous devez juste avoir besoin de sous-classe UitextView et de surcharge -Layoutsubviews, qui sera appelé lorsque la bulle d'autocorrie est ajoutée.
En effectuant la recherche de l'uautocorrecinlinepromptPrompt dans une liste déroulante ou swizzledSubviews, il est possible de modifier la disposition de la correction afin qu'elle apparaisse au-dessus. Vous pouvez le faire sans appeler d'API privées en recherchant les points de vue des classes particuliers positionnés de manière à ce que vous vous attendiez. Cet exemple fonctionne à quelle vue est lequel, vérifie que la correction n'est pas déjà au-dessus du texte et déplace la correction ci-dessus et la dessine sur la fenêtre afin qu'elle ne soit pas bornée par UitextView elle-même. Évidemment, si Apple modifie la mise en œuvre sous-jacente, cela ne parviendra pas à déplacer la correction. Ajoutez ceci à votre mise en œuvre de la suralimentation ou de la mise en œuvre SwizzledSubviews.
- (void) moveSpellingCorrection { for (UIView *view in self.subviews) { if ([[[view class] description] isEqualToString:@"UIAutocorrectInlinePrompt"]) { UIView *correctionShadowView = nil; // [view correctionShadowView]; for (UIView *subview in view.subviews) { if ([[[subview class] description] isEqualToString:@"UIAutocorrectShadowView"]) { correctionShadowView = subview; break; } } if (correctionShadowView) { UIView *typedTextView = nil; //[view typedTextView]; UIView *correctionView = nil; //[view correctionView]; for (UIView *subview in view.subviews) { if ([[[subview class] description] isEqualToString:@"UIAutocorrectTextView"]) { if (CGRectContainsRect(correctionShadowView.frame,subview.frame)) { correctionView = subview; } else { typedTextView = subview; } } } if (correctionView && typedTextView) { CGRect textRect = [typedTextView frame]; CGRect correctionRect = [correctionView frame]; if (textRect.origin.y < correctionRect.origin.y) { CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0,-50.0); [correctionView setTransform: moveUp]; [correctionShadowView setTransform: moveUp]; CGRect windowPos = [self convertRect: view.frame toView: nil ]; [view removeFromSuperview]; [self.window addSubview: view]; view.frame = windowPos; } } } } } }
Merci pour le code. C'est certainement intéressant, mais je suis d'accord avec certains des autres commentaires qu'il est trop imprévisible pour une utilisation générale.
Cela nécessite un correctif - il ne prend pas en compte l'orientation de l'interface.
Cela semblait fonctionner bien, mais le réparent a provoqué la vue AutoCorrection de passer à une position Y très faible après une seconde clé (c'est-à-dire lorsque son contenu est prolongé). Une idée pourquoi?
Mettre la méthode ci-dessous, régleraToTocorrecTPrompTview dans lesyouplages a fonctionné pour moi dans le portrait et le paysage. J'ai une catégorie qui fournit les méthodes inférieures et supérieures sur la vue, mais vous obtenez l'idée.
NSArray * subviewsWithDescription(UIView *view, NSString *description) { return [view.subviews filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"class.description == '%@'", description]]]; } - (void) adjustAutocorrectPromptView; { UIView *autocorrectPromptView = [subviewsWithDescription(self, @"UIAutocorrectInlinePrompt") lastObject]; if (! autocorrectPromptView) { return; } UIView *correctionShadowView = [subviewsWithDescription(autocorrectPromptView, @"UIAutocorrectShadowView") lastObject]; if (! correctionShadowView) { return; } UIView *typedTextView = nil; //[view typedTextView]; UIView *correctionView = nil; //[view correctionView]; for (UIView *subview in subviewsWithDescription(autocorrectPromptView, @"UIAutocorrectTextView")) { if (CGRectContainsRect(correctionShadowView.frame,subview.frame)) { correctionView = subview; } else { typedTextView = subview; } } if (correctionView && typedTextView) { if (typedTextView.top < correctionView.top) { correctionView.bottom = typedTextView.top; correctionShadowView.center = correctionView.center; } } }
faire en fait définira la bulle sur le texte ... La mise en garde est que vous perdez du défilement, dans mon cas, ce n'était pas un problème en raison de la havinng un champ de texte Seulement à des fins d'entrée avec limite de caractères p> p>
+1 Combinés avec contestus pour que vous puissiez désactiver / activer le défilement lorsqu'il est nécessaire.
Ça ne le fait pas pour moi. iOS9.3.1 En cours d'exécution sur le simulateur iPhone 6S, je reçois toujours le texte de l'autocorrie ci-dessous.
Oui, cela a été fait sur la crainte de l'IOS7, je devrais vérifier cette solution s'il fonctionne toujours sur de nouveaux appareils.
En réalité, le clavier utilise simplement le résultat de - [UITEXTINUPT TEXTINUTVIEWVIEW] pour déterminer où placer la vue de correction (et demander si votre vue prend en charge la correction). Donc, tout ce que vous avez à faire est celui-ci:
- (CGRect)firstRectForRange:(CoreTextTokenTextRange *)range { CGRect firstRect = [self firstRectForRangeInternal:range]; return [self convertRect:firstRect toView:[self textInputView]]; }
Seulement deux choix: 1) Utilisation de méthodes privées ou 2) Déplacement de votre UitextView assez haut pour que votre bulle de correction ne soit pas obscurcie.