Je travaille sur une application dans laquelle je suis obligé de redimensionner automatiquement la zone de texte en fonction du texte à afficher.
Premièrement, je ne suis pas sûr pour cela que je devrais aussi utiliser UILabel
(Logiquement, c’est le meilleur choix pour afficher du texte statique, ce qui est dans mon cas) ou UITextView
.
Comment je souhaite l'utiliser?
Je veux simplement lancer ma vue Étiquette ou texte avec le texte. Au lieu de cela, je définis d'abord le cadre, puis mon texte est restreint dans cette zone.
Si vous pouvez suggérer la bonne solution, ce sera d'une grande aide.
J'ai parcouru la documentation et d'autres références, mais je n'ai pas trouvé grand chose qui pourrait m'aider ou que j'aurais pu l'ignorer.
La méthode sizeToFit
a fonctionné à merveille.
J'ai suivi.
UILabel *testLabel =[[UILabel alloc] initWithFrame:CGRectMake(6,3, 262,20 )]; // RectMake(xPos,yPos,Max Width I want, is just a container value);
NSString * test=@"this is test this is test inthis is test ininthis is test inthis is test inthis is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...";
testLabel.text = test;
testLabel.numberOfLines = 0; //will wrap text in new line
[testLabel sizeToFit];
[self.view addSubview:testLabel];
Vous pouvez trouver une taille de texte avec:
CGSize textSize = [[myObject getALongText]
sizeWithFont:[UIFont boldSystemFontOfSize:15]
constrainedToSize:CGSizeMake(maxWidth, 2000)
lineBreakMode:UILineBreakModeWordWrap];
alors vous pouvez créer votre UILabel
comme ça:
UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0,0,textSize.width, textSize.height];
[lbl setNumberOfLines:0];
[lbl setLineBreakMode:UILineBreakModeWordWrap];
[lbl setText:[myObject getALongText]];
En rapide:
testLabel = UILabel(frame: CGRectMake(6, 3, 262, 20))
testLabel.text = test
testLabel.numberOfLines = 0
testLabel.sizeToFit()
En objectif c
UILabel *testLabel = [[UILabel alloc] initWithFrame: CGRectMake(6, 3, 262, 20)]];
testLabel.text = test;
testLabel.numberOfLines = 0;
[testLabel sizeToFit];
Si vous voulez redimensionner UILabel uniquement en hauteur, utilisez ceci:
@property (nonatomic, weak) IBOutlet UILabel *titleLabel;
CGRect titleLabelBounds = self.titleLabel.bounds;
titleLabelBounds.size.height = CGFLOAT_MAX;
// Change limitedToNumberOfLines to your preferred limit (0 for no limit)
CGRect minimumTextRect = [self.titleLabel textRectForBounds:titleLabelBounds limitedToNumberOfLines:2];
CGFloat titleLabelHeightDelta = minimumTextRect.size.height - self.titleLabel.frame.size.height;
CGRect titleFrame = self.titleLabel.frame;
titleFrame.size.height += titleLabelHeightDelta;
self.titleLabel.frame = titleFrame;
Vous pouvez maintenant utiliser titleLabelHeightDelta
pour mettre en forme d'autres vues en fonction de la taille de votre étiquette (sans utiliser autolayout).
Je ne suis pas sûr de bien comprendre la question, mais vous pouvez utiliser la méthode sizeToFit
sur un UILabel
(la méthode est héritée de UIView
) pour modifier la taille en fonction de le texte de l'étiquette.
La meilleure façon de trouver le non. de lignes en fonction du texte. Vous pouvez utiliser ce code:
ceil(([aText sizeWithFont:aFont].width)/self.bounds.size.width-300);
il retourne une valeur float.
[lbl setNumberOfLines:floatvalue];
Comme vous allez utiliser cette solution d'innombrables fois dans votre application, procédez comme suit:
1) Créez un répertoire appelé extensions
et ajoutez un nouveau fichier appelé UILabel.Swift
Avec le code suivant:
import UIKit
extension UILabel {
func resizeToText() {
self.numberOfLines = 0
self.sizeToFit()
}
}
2) Dans le code de votre application, définissez la largeur d'étiquette souhaitée et appelez simplement resizeToText()
:
label.frame.size.width = labelWidth
label.resizeToText()
Cela maintiendra la largeur tout en augmentant automatiquement la hauteur.
Veuillez noter qu'avec l'appel automatique, sizeToFit ne changera pas de taille, car il sera modifié ultérieurement par des calculs d'autolayout. Dans ce cas, vous devez configurer la contrainte de hauteur appropriée pour votre UILabel avec la valeur "height> = xx".
Vous pouvez changer la taille de l'étiquette en fonction de la longueur de la chaîne en utilisant cette fonction
func ChangeSizeOfLabel(text:String) -> CGSize{
let font = UIFont(name: "HelveticaNeue", size: 12)!
let textAttributes = [NSFontAttributeName: font]
let size = text.boundingRectWithSize(CGSizeMake(310, 999), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
let adjustSize = CGSizeMake(size.width, size.height)
return adjustSize
}
et l'utiliser comme ça:
laisser
showLabel.frame = CGRectMake(x, y, width , self.ChangeSizeOfLabel("Hello , Height is changing dynamically.....").height)
essayez le code ci-dessous, cela fonctionne pour multiligne
self.labelText.text = string;
self.labelText.lineBreakMode = NSLineBreakByWordWrapping;
self.labelText.numberOfLines = 0;