8
votes

UITEXTVIEW (édition) - Détection de l'événement de ligne suivant s'est produit

J'ai un uitextview qui est éditable. Maintenant, j'ai une exigence qui nécessite que je trouve (comme et lorsque je continue à taper) quant au début de la ligne suivante (peut-être que jeûne de frapper la clé de retour ou d'une linefreak de WordWrap automatique). Existe-t-il une notification qui peut être obtenue pour comprendre lorsque la ligne suivante a commencé lors de la frappe?

J'ai essayé de chercher des solutions pour rechercher des positions de curseur dans une vue textuelle, mais à l'aide de la sélection de la sélection et des propriétés de localisation pour le trouver ne m'aide pas. Il n'y a pas de corrélation entre la valeur de l'emplacement et une nouvelle ligne. La valeur de localisation continue d'augmenter sur la dactylographie. Des idées?

Merci!


0 commentaires

7 Réponses :


11
votes

Le délégué suivant est appelé chaque fois qu'un nouveau texte est entré dans TextView.

Définissez le délégué pour UITEXTVIEW, puis code comme suit xxx


5 commentaires

J'utilise déjà uitextviewtextDidCangenotification. Et comment puis-je rechercher A \ N dans le texte? Le TextView.text ne renvoie pas tout le tas de texte dactylographié jusqu'à présent? Une ligne de ligne automatiquewordwordwrap peut avoir eu lieu ou j'aurais peut-être frappé beaucoup d'espaces. Comment détecter l'arrivée de la ligne suivante dans ce contexte?


@bourne: oui sa détection de la clé de retour seul


Oui. Mais il détecte une nouvelle ligne uniquement lorsqu'il existe une vue imprudente et la première chose à laquelle vous frappez à l'intérieur est une clé de retour. Je cherche à gérer le scénario Wordwrap multilignesView WordView où le WordWrap provoque automatiquement un chevreake. Je souhaite détecter cet événement en quelque sorte.


Était-ce déjà résolu? J'ai besoin de détecter des pauses de ligne Word-Wrap.


J'ai résolu tout simplement pas en détectant la hauteur du TextView (mines appelée Hiddentext) et la divisant par le changement de hauteur avec une nouvelle ligne ...



3
votes

détectera la ligne change de quelque chose à la frappe à la frappe "retour", à la backspaceing pour réduire le nombre de lignes, en tapant jusqu'à la fin de la ligne et une pellicule de mots surveille, etc. (* Remarque: Doit ajuster les variables pour la taille de la police, i Recommander ne pas utiliser les numéros codés durs comme dans mon exemple ci-dessous).

previousNumberOfLines = ((hiddenText.contentSize.height-37+21)/(21));//numbers will change according to font size
NSLog(@"%i", previousNumberOfLines);


1 commentaires

Revenez à cela de ces nombreuses années plus tard, je recommanderais maintenant à l'aide d'une propriété uitextview's> .font.pointsize , au lieu d'utiliser simplement les numéros codés durs que j'ai données dans mon exemple. Notez que, lors de la frappe, certains caractères complexes Unicode peuvent causer de la contenus pour ajuster légèrement la hauteur sans une nouvelle ligne se produisant, il est donc important que vous ne surveilliez pas seulement le contenu. Les changements ne changent seuls, mais divisez par la police indiquent de manière à ce que les mathématiques représentent les comptes de la police. le seuil d'une nouvelle ligne réelle et non seulement un léger changement de hauteur de ligne.



0
votes

Ajoutez une deuxième vue de texte cachée à votre vue. Implémentez dopplangeTextinRange pour la vue Text visible et définissez le texte sur la vue cachée sur le nouveau texte. Comparez le contenu du nouveau texte vs ancien pour détecter Word Wrap.


0 commentaires

0
votes
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
 replacementText:(NSString *)text
{

    if ([text isEqualToString:@"\n"]) {
        textView.text=[NSString stringWithFormat:@"%@\n",textView.text];
        // Return FALSE so that the final '\n' character doesn't get added
        return NO;
    }
    // For any other character return TRUE so that the text gets added to the view
    return YES;
}

0 commentaires


6
votes

pour SWIFT Utilisez ce xxx

pour objectif c xxx


2 commentaires

Fonctionne idéal pour Swift mais le défilement doit être activé sur le TextView


Cela ne fonctionne pas. Si vous tapez un tas de texte, puis commencez à éditer au milieu du document, l'origine devient invalide et la condition n'est plus vraie.



1
votes

La solution de Sourav Gupta a été partiellement travaillé pour moi, mais il y avait quelques pièges, à savoir qu'il n'a pas appelé correctement le code cible si l'édition s'est produite au milieu du corps du texte (par exemple: écrire un tas de texte, en mouvement le curseur au milieu puis frappant le retour trois fois) ainsi que manipuler des événements d'insertion comme le colle et la correction du texte. En conséquence, j'ai fait des tests seuls et j'ai trouvé quelques conditions supplémentaires dans lesquelles nous pouvons supposer que l'édition s'est déplacée à la ligne suivante.

Note: Cette approche a quelques faux positifs mais j'ai trouvé que Pour être plus tolérable, car j'utilise ceci pour relais le code et que la mise en place inutilement est bien meilleure que de ne pas répondre forte> p>

SWIFT 5 H1>
private var previousRect:CGRect = CGRect.zero
private func checkIfReturnOrLineWrap(textView:UITextView) {
    let currentRect = textView.caretRect(for:textView.endOfDocument)
    if (currentRect.origin.y != previousRect.origin.y && (previousRect.origin.y != CGFloat.infinity || currentRect.origin.y > 0) ||
        currentRect.origin.y == CGFloat.infinity) {
        //React to the line change!
    }
    previousRect = currentRect
}

//MARK: UITextViewDelegate methods (be sure to hook up your textviews!)
func textViewDidChange(_ textView: UITextView) {
    checkIfReturnOrLineWrap(textView: textView)
}

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    checkIfReturnOrLineWrap(textView: textView)
    return true
}


0 commentaires