sizeWithFont ne donne pas la hauteur correcte pour UITextView s'il y a une longue chaîne dans le texte qui est enveloppé
Est-il un moyen pour obtenir la taille correcte d'un NSString à l'aide de:
- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode
ce n'est pas pour l'obtenir jeté par 2 ou 3 centaines de chaînes de caractères. À l'heure actuelle si j'essaie d'utiliser cette méthode sur ces longues chaînes qu'il calcule de manière incorrecte et je me retrouve avec beaucoup d'espaces au bas de la UITextView.
J'ai essayé d'utiliser UILineBreakModeWordWrap et UILineBreakModeCharacterWrap.
le redimensionnement est effectué dans
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat result = 44.0f;
NSString* text = nil;
CGFloat width = 0;
CGFloat tableViewWidth;
CGRect bounds = [UIScreen mainScreen].bounds;
tableViewWidth = bounds.size.width;
width = tableViewWidth - 150;
text = stringWithLongWords;
if (text) {
CGSize textSize = { width, 20000.0f };
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:10.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
size.height += 50.0f;
result = MAX(size.height, 44.0f+30.0f);
}
return result;
}
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
UITextView
est pas exactement comme unUILabel
enveloppé dans unUIScrollView
. Il a l'espacement des lignes différentes de la taille de la police et les marges quesizeWithFont:constrainedToSize:linkBreakMode:
ne tient pas compte.Connaître votre taille de la police, vous pourriez être en mesure de calculer le nombre de lignes et de prendre la ligne d'espacement en compte. Vous pouvez le deviner à la marge et essayer de tromper les
sizeWithFont:
de donner une réponse utile.Solutions populaires semblent être:
il suffit d'utiliser un
UILabel
si vous n'avez pas besoin de toutUITextView
fonctionnalitési vous avez besoin d'
hyperlinks
la superpositionUIButtons
qui ressemblent à des liens hypertexte sur uneUILabel
utiliser un écran
UITextView
et sessizeToFit
méthode pour obtenir une vraie réponseJ'ai pas eu de chance w/la 3ème option, mais il semble que cela devrait fonctionner, donc peut-être que j'ai fait quelque chose de mal.
Je vais essayer d'utiliser un
UILabel
et en y ajoutant des boutons pour les liens hypertexte. Nous allons voir comment cela se termine.Si cela échoue, il y a toujours l'option prise par Loren Brichter (de Tweetie fame): dessiner le tout dans un
UIView
vous-même à l'aide deCoreGraphics
.Bonne chance!
Découvrez ce post Comment puis-je taille un UITextView à son contenu?
Il ressemble textView.contentSize.la hauteur de travail (avec la mise en garde que le bon contentSize n'est disponible qu'après la UITextView a été ajouté à la vue avec addSubview)
Vous avez dit que vous avez un
UITableView
avec différentes hauteurs. Avez-vous mis de la réutilisation de l'identificateur de la même chose pour toutes les cellules? Il se pourrait que les cellules plus âgées avec leur de hauteur déjà mis sont réutilisées. Si c'est le problème, vous devez redimensionner la cellule de nouveau pour qu'il puisse être réutilisé.La meilleure solution que j'ai trouvé pour l'instant est d'avoir un caché UITextView avec les mêmes paramètres de police, et l'ensemble de son texte. Après que son contetSize doit être exacte.
La largeur que vous utilisez est la largeur de votre UITextView... mais vous n'êtes pas concerné par cette largeur, vous êtes concernés par la largeur de la zone de texte imbriqué à l'intérieur de l'affichage de texte.
UITextViews, par défaut, de rembourrage autour de leurs frontières pour produire un espace entre le texte tapé et le bord de la UITextView quelques pixels de large (et long pour le haut)... Pour obtenir la taille correcte vous ne devriez pas utiliser
textView.frame.size.width
mais plutôt,
textView.frame.size.width-(textView.contentInset.left+textView.contentInset.right+textView.textContainerInset.left+textView.textContainerInset.right+textView.textContainer.lineFragmentPadding/*left*/+textView.textContainer.lineFragmentPadding/*right*/)
^Qui prend la largeur de la UITextView et soustrait tous le rembourrage de sorte que vous êtes de gauche avec la largeur de seulement le type de mesure zone de texte.
En va de même pour la hauteur, sauf pour
lineFragmentPadding
n'ont pas de fond de sorte que vous ne soustrayez une fois au lieu de deux fois.Le code final est quelque chose comme ceci:
Inspiré par @MrNickBarker réponse, voici ma solution:
La seule question qui reste pour moi, c'est que cela ne fonctionne pas avec modification des encarts.
Encore ne peut pas croire que de tels rebondissements sont nécessaires, mais depuis
-[NSString sizeWithFont:forWidth:lineBreakMode:]
ne respecte pas les encarts, les rembourrages, les marges, la ligne, l'espacement et l'aime bien, il semble que ce soit la seule solution de travail en ce moment (c'est à dire iOS 6).