Dans iOS 7, sizeWithFont:
est désormais obsolète. Comment puis-je maintenant passer l'objet UIFont dans la méthode de remplacement sizeWithAttributes:
?
objective-c
deprecated
ios7
James Kuang
la source
la source
NSString
et unUILabel
(pas TOUJOURS le cas, mais souvent), pour éviter la duplication de code / etc., vous pouvez également remplacer[UIFont systemFontOfSize:17.0f]
parlabel.font
- aide à la maintenance du code en référençant les données existantes par rapport à vous en les tapant plusieurs fois ou en référençant des constantes partout dans le place, etcboundingRectWithSize:options:attributes:context:
place, en passantCGSizeMake(250.0f, CGFLOAT_MAX)
dans la plupart des cas.Je crois que la fonction était obsolète parce que cette série de
NSString+UIKit
fonctions (sizewithFont:...
, etc.) était basée sur laUIStringDrawing
bibliothèque, qui n'était pas sûre pour les threads. Si vous avez essayé de les exécuter non pas sur le thread principal (comme toute autreUIKit
fonctionnalité), vous obtiendrez des comportements imprévisibles. En particulier, si vous exécutez la fonction sur plusieurs threads simultanément, cela bloquera probablement votre application. C'est pourquoi dans iOS 6, ils ont introduit uneboundingRectWithSize:...
méthode pourNSAttributedString
. Cela a été construit au-dessus desNSStringDrawing
bibliothèques et est thread-safe.Si vous regardez la nouvelle
NSString
boundingRectWithSize:...
fonction, elle demande un tableau d'attributs de la même manière qu'un aNSAttributeString
. Si je devais deviner, cette nouvelleNSString
fonction dans iOS 7 est simplement un wrapper pour laNSAttributeString
fonction d'iOS 6.Sur cette note, si vous ne preniez en charge que iOS 6 et iOS 7, je changerais certainement tous vos fichiers
NSString
sizeWithFont:...
enNSAttributeString
boundingRectWithSize
. Cela vous évitera beaucoup de maux de tête si vous avez un étui d'angle multi-threading étrange! Voici comment j'ai convertiNSString
sizeWithFont:constrainedToSize:
:Ce qui était autrefois:
Peut être remplacé par:
Veuillez noter que la documentation mentionne:
Donc, pour extraire la hauteur ou la largeur calculée à utiliser pour dimensionner les vues, j'utiliserais:
la source
Comme vous pouvez le voir
sizeWithFont
sur le site Apple Developer, il est obsolète, nous devons donc l'utilisersizeWithAttributes
.la source
[NSObject respondsToSelector:]
méthode comme ici: stackoverflow.com/a/3863039/1226304J'ai créé une catégorie pour gérer ce problème, la voici:
De cette façon, vous n'avez qu'à trouver / remplacer
sizeWithFont:
parsizeWithMyFont:
et vous êtes prêt à partir.la source
Dans iOS7, j'avais besoin de la logique pour renvoyer la hauteur correcte pour la méthode tableview: heightForRowAtIndexPath, mais la tailleWithAttributes renvoie toujours la même hauteur quelle que soit la longueur de la chaîne car elle ne sait pas qu'elle va être placée dans une cellule de tableau à largeur fixe . J'ai trouvé que cela fonctionne très bien pour moi et calcule la bonne hauteur en tenant compte de la largeur de la cellule du tableau! Ceci est basé sur la réponse de M. T ci-dessus.
la source
Les étiquettes multilignes utilisant la hauteur dynamique peuvent nécessiter des informations supplémentaires pour définir correctement la taille. Vous pouvez utiliser sizeWithAttributes avec UIFont et NSParagraphStyle pour spécifier à la fois la police et le mode de saut de ligne.
Vous définiriez le style de paragraphe et utiliseriez un NSDictionary comme ceci:
Vous pouvez utiliser la propriété CGSize 'adjustSize' ou CGRect comme propriété rect.size.height si vous recherchez la hauteur.
Plus d'informations sur NSParagraphStyle ici: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html
la source
la source
Créez une fonction qui prend une instance UILabel. et retourne CGSize
la source
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Solution alternative-
la source
S'appuyant sur @bitsand, il s'agit d'une nouvelle méthode que je viens d'ajouter à ma catégorie NSString + Extras:
J'utilise juste la taille de l'image résultante.
la source
Vous pouvez toujours utiliser
sizeWithFont
. mais, dans la méthode iOS> = 7.0, le blocage se produit si la chaîne contient des espaces ou des lignes de fin et de début\n
.Découper du texte avant de l'utiliser
Cela peut également s'appliquer à
sizeWithAttributes
et[label sizeToFit]
.aussi, chaque fois que vous avez un
nsstringdrawingtextstorage message sent to deallocated instance
appareil iOS 7.0, il traite cela.la source
Mieux utiliser les dimensions automatiques (Swift):
NB: 1. Le prototype UITableViewCell doit être correctement conçu (pour l'instance, n'oubliez pas de définir UILabel.numberOfLines = 0, etc.) 2. Supprimer la méthode HeightForRowAtIndexPath
VIDÉO: https://youtu.be/Sz3XfCsSb6k
la source
la source
La réponse acceptée dans Xamarin serait (utilisez sizeWithAttributes et UITextAttributeFont):
la source
Comme la réponse @Ayush:
Eh bien, en supposant qu'en 2019+, vous utilisez probablement Swift et
String
au lieu d'Objective-c etNSString
, voici la bonne façon d'obtenir la taille d'unString
avec une police prédéfinie:la source
la source
Voici l'équivalent monotouch si quelqu'un en a besoin:
qui peut être utilisé comme ceci:
la source
la source
Essayez cette syntaxe:
la source
Rien de tout cela n'a fonctionné pour moi dans iOS 7. Voici ce que j'ai fini par faire. Je mets cela dans ma classe de cellule personnalisée et appelle la méthode dans ma méthode heightForCellAtIndexPath.
Ma cellule ressemble à la cellule de description lors de l'affichage d'une application dans l'App Store.
Tout d'abord dans le storyboard, définissez votre étiquette sur 'AttribedText', définissez le nombre de lignes sur 0 (ce qui redimensionnera automatiquement l'étiquette (iOS 6+ uniquement)) et définissez-le sur un retour à la ligne.
Ensuite, je viens d'ajouter toutes les hauteurs du contenu de la cellule dans ma classe de cellule personnalisée. Dans mon cas, j'ai une étiquette en haut qui dit toujours "Description" (_descriptionHeadingLabel), une étiquette plus petite de taille variable qui contient la description réelle (_descriptionLabel) une contrainte du haut de la cellule à l'en-tête (_descriptionHeadingLabelTopConstraint) . J'ai également ajouté 3 pour espacer un peu le bas (environ la même quantité de pomme place sur la cellule de type de sous-titre).
Et dans mon délégué Table View:
Vous pouvez modifier l'instruction if pour qu'elle soit un peu plus «intelligente» et obtenir réellement l'identifiant de cellule à partir d'une sorte de source de données. Dans mon cas, les cellules vont être codées en dur car il y en aura un nombre fixe dans un ordre spécifique.
la source
boundingRectWithSize
dans ios 9.2 présente des problèmes, les résultats sont différents de ios <9.2. Vous avez trouvé ou connaissez une autre meilleure façon de procéder.