78 votes

iOS7 UITextView contentsize.height alternative

Je suis le portage de l'une des apps de iOS 6.1 d'iOS 7. Je suis en utilisant une mise en page où il y a un UITextView qui a une largeur fixe, mais c'est la hauteur est basée sur son contentsize. Pour iOS 6.1 vérification de la contentsize.de la hauteur et de la définir comme le textview de trame de hauteur a été assez, mais il ne fonctionne pas sur iOS 7.

Comment puis-je créer un UITextView avec une largeur fixe, mais la dynamique de la hauteur en fonction du texte qu'il les montre?

NOTE: je suis la création de ces points de vue à partir du code, pas avec Interface Builder.

180voto

Jordan Montel Points 5846

Avec ce code, vous pouvez changer la hauteur de vos UITextView en fonction d'une largeur fixe (il fonctionne sur iOS 7 et les versions antérieures) :

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width
{
    UITextView *textView = [[UITextView alloc] init];
    [textView setAttributedText:text];
    CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}

Avec cette fonction, vous pourrez prendre un NSAttributedString et une largeur fixe pour revenir à la hauteur nécessaire.

Si vous voulez calculer l'image à partir d'un texte avec une police spécifique vous, plus besoin d'utiliser le code suivant :

- (CGSize)text:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
        CGRect frame = [text boundingRectWithSize:size
                                          options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        return frame.size;
    }
    else
    {
        return [text sizeWithFont:font constrainedToSize:size];
    }
}

Vous pouvez ajouter qu' SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO sur votre préfixe.pch fichier dans votre projet:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

Vous pouvez également remplacer le test précédent) SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) par :

if ([text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])‌

42voto

Ana Points 375

Cela a fonctionné pour moi pour iOS6 et 7 :

21voto

nova Points 226

Dans iOS7, utilise au texte de la disposition :

désactiver fixer :

15voto

Blake Hamilton Points 101

Utilisez cette fonction peu

4voto

xZenon Points 161

Ma solution finale est issue de HotJard, mais inclut des EISN haut et le bas du conteneur de texte au lieu d’utiliser 2*fabs(textView.contentInset.top) :

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