web-dev-qa-db-fra.com

Grand texte coupé dans UITextView qui se trouve dans UIScrollView

J'ai un sérieux problème que je n'arrive pas à résoudre et ça me rend fou depuis deux jours. J'ai cherché loin et je ne trouve pas de solution, même si j'en ai essayé beaucoup.

J'ai un UITextView à l'intérieur d'un UIScrollView. Je suis capable de redimensionner dynamiquement le UITextView à l'intérieur de la scrollview pour afficher le texte. Mais lorsque le UITextView contient du texte très volumineux, il est coupé lorsque je défile presque jusqu'à la fin. Cependant, le cadre du UIScrollView est toujours dimensionné correctement.

J'ai lu ces messages: thisthis et beaucoup d'autres similaires.

UIScrollview et UITextview sont tous deux créés dans le xib à l'aide d'AutoLayout.

Voici mon code actuel et une capture d'écran, comme vous pouvez le voir, l'endroit vide de la capture d'écran doit être rempli de texte. veuillez aider.

enter image description here

- (void)viewDidAppear:(BOOL)animated
{
    CGRect frame = self.longDescField.frame;
    frame.size.height = self.longDescField.contentSize.height;
    self.longDescField.frame = frame;

    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width,  self.longDescField.contentSize.height + 200);
    self.scrollView.scrollEnabled = YES;
    [self.scrollView flashScrollIndicators];
}
54
sudo

Ce problème existe depuis iOS 7 et est toujours présent dans iOS 12.

Cependant, je n'ai pas pu conserver le comportement de défilement normal en définissant scrollEnabled = NO avant le redimensionnement, comme recommandé par @igz. Au lieu de cela, j'ai changé le défilement on et off après le redimensionnement

// Resize text view here

textView.scrollEnabled = NO;
textView.scrollEnabled = YES;

Cela a forcé le texte coupé à s'afficher correctement.

131
Mike

Merci à tous pour votre aide. C'est finalement ce qui a fini par fonctionner pour moi dans iOS7.

J'ai dû désactiver la mise en page automatique pour ce xib particulier.

Puis a fait ce qui suit:

[textView setScrollEnabled:YES];
[textView setText:text];
[textView sizeToFit];
[textView setScrollEnabled:NO];
15
sudo

Pour moi, la solution était de mettre sizeToFit après avoir personnalisé le textView

[self.yourTextView sizeToFit];

Cela doit être la dernière chose que vous faites lorsque vous manipulez la vue de texte, ne doit pas l'être avant de remplir le texte du contenu.

10
meda

Certainement iOS7. J'ai eu ce même problème en s'appliquant à tous les UITextViews qui ont été redimensionnés, à la fois xib et code généré. J'ai trouvé que le textContainer.size devait être ajusté après la modification du cadre UITextView.

J'ai créé ce code de catégorie pour ajuster le textContainer.size mais il semble également avoir besoin d'être ajusté après avoir également défini la valeur du texte, donc je dois appeler adjustAfterFrameChange après tout changement de texte s'ils ne sont pas suivis par la définition de la taille du cadre. Ce code suppose que UITextView ne fait rien avec setFrame: lui-même, alors sortez setFrame: et appelez adjustAfterFrameChange manuellement si vous voulez éviter ce risque

Modifier: changé

self.textContainer.size = self.frame.size; // fix for cut off text

à

self.textContainer.size = self.contentSize; // fix for cut off text

@interface UITextView(Extras)

- (void)adjustAfterFrameChange;

@end



@implementation UITextView(Extras)

- (void)adjustAfterFrameChange {
#if defined(__IPHONE_7_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0
    if ([self respondsToSelector:@selector(textContainer)])
        self.textContainer.size = self.contentSize; // fix for cut off text
#endif
}


- (void)setFrame:(CGRect)frame {
    [super setFrame:frame];

    [self adjustAfterFrameChange];
}

@end
7
K1w1Geek

Ce problème peut être résolu en définissant la propriété de disposition contiguë sur false.

textView.layoutManager.allowsNonContiguousLayout = false

Bien que la documentation indique que la valeur par défaut est false, elle est en fait définie sur true pour un UITextView.

5
ArunGJ

J'ai eu un problème similaire, dans lequel le texte long était coupé après un redimensionnement de la vue texte. Désactiver scrollingEnabled avant que le redimensionnement ne semble le corriger. Bien sûr, cela ressemble à un bug IOS 7.

5
igz

Essaye ça

[self.textView setContentInset:UIEdgeInsetsMake(-8.0, 0, -8.0, 0)];

Cela fonctionne pour l'affichage du texte coupé dans UITextView.

5
zedzhao

Essayez ça.

Dans IOS 8 et Xcode 6.3,

textview.scrollEnabled=YES;
[self.textview setContentInset:UIEdgeInsetsMake(-10.0, 0, -5.0, 0)];
2
Rana Raza

Nous avons eu un problème comme celui-ci avec le déploiement d'iOS7. Lorsque nous avons appelé setText qui a ajouté une nouvelle ligne (ou des lignes) à notre UITextView, la textview n'utilisait pas la nouvelle hauteur correcte pour son redessin. SetNeedsDisplay, setNeedsLayout, redessiner les calques, redessiner la vue entière, etc. tout n'a pas fonctionné. Enfin, nous avons forcé une perte et un gain de concentration:

[textView resignFirstResponder];
[textView becomeFirstResponder];

Cela a forcé le recalcul de la hauteur et un nouveau tracé correct. Heureusement, cela ne fait pas ressortir le clavier, mais cela vaut la peine de tester la régression que sur toutes les versions d'iOS prises en charge par votre application.

1
Kelly

Nous avons eu le même problème, sauf que la moitié gauche ou la moitié droite de l'UITextView était coupée. Arrivé sur iOS 7 et iOS 6, sur une variété de téléphones. Appel:

myTextView.scrollEnabled = NO;

in viewWillAppear a résolu le problème.

1
jlegakis

J'ai le même problème pour une visualisation de texte (sans défilement). Résolu cela (Xcode 7.3.1, iOS 9.3) simplement en décochant "Défilement activé" dans l'inspecteur d'attributs.

1
Francesco

Aucune de ces réponses n'a fonctionné pour moi.

J'étais en train de tromper avec le storyboard et ça marche maintenant. Il semble toujours mal dans le storyboard, mais sur l'appareil, il s'affiche désormais correctement.

J'ai fait diverses choses, y compris le basculement de nombreuses options pour le champ de texte.

I pensez ce qui l'a corrigé pour moi était agrandir la vue, la construire et la redonner à la bonne taille.

Mes excuses pour une réponse vague et incertaine, mais peut-être que cela aide. Ce projet a été écrit à l'origine pour iOS 5, et la vue texte n'a peut-être pas été gâchée depuis lors.

1
csga5000

Cela se produit tout le long, depuis Interface Builder aussi.

Lorsque la vue texte est sélectionnée, dans l'inspecteur des utilitaires, décochez l'option Affiche l'indicateur vertical. Le texte rogné apparaît maintenant.

1

Je peux me tromper, mais je ne comprends pas bien votre problème, mais à quoi sert l'utilisation d'un UIScrollView car avec la classe UITextView implémente le comportement d'une région de texte défilante et multiligne?

Vous devez jeter le UIScrollView.

0
LudoZik

Je suis confronté à la même situation. Je dois désactiver le défilement de UITextView et cela provoque la coupure de la dernière ligne. Voici ma solution:

//In the  UITextView subClass, override "gestureRecognizerShouldBegin" and let the scrolling of UITextView remain on.

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && gestureRecognizer.view == self){
        return NO;
    }
    return [super gestureRecognizerShouldBegin:gestureRecognizer];
}
0
Jagie

Dans Swift j'ai résolu ce problème en définissant simplement le textContainerInset de mon UITextView:

textView.textContainerInset = UIEdgeInsets(top: 0.0, left: 0.0,
                                           bottom: 50.0, right: 0.0)
0
NoodleOfDeath