Ist es möglich, die UILabel-Box/die Begrenzungen automatisch an den enthaltenen Text anzupassen? (Es ist mir egal, ob er größer als die Anzeige ist)
Wenn ein Benutzer also "Hallo" oder "Mein Name ist wirklich lang, ich möchte, dass er in dieses Feld passt" eingegeben wird, wird er niemals abgeschnitten und das Label wird entsprechend "erweitert".
Bitte sehen Sie sich meine Gist an, wo ich eine Kategorie für UILabel
für etwas sehr ähnliches erstellt habe. Meine Kategorie lässt eine UILabel
-Dehnung um die Höhe des gesamten Inhalts zu: https://Gist.github.com/1005520
Oder checke diesen Beitrag: https://stackoverflow.com/a/7242981/662605
Dies würde die Höhe dehnen, aber Sie können es leicht ändern, um es in die andere Richtung zu bringen und die Breite mit etwas wie diesem zu strecken. Ich glaube, was Sie tun möchten:
@implementation UILabel (dynamicSizeMeWidth)
- (void)resizeToStretch{
float width = [self expectedWidth];
CGRect newFrame = [self frame];
newFrame.size.width = width;
[self setFrame:newFrame];
}
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
Sie können eher die sizeToFit
-Methode der UIView
-Klasse verwenden, die Anzahl der Zeilen jedoch auf 1 setzen, um sicher zu sein.
Wenn Sie AutoLayout verwenden, haben Sie eine integrierte Lösung. Wenn Sie die Anzahl der Zeilen auf 0 setzen, wird die Größe des Labels durch das Framework entsprechend angepasst (zusätzliche Höhe wird hinzugefügt), um es an Ihren Text anzupassen.
sizeWithFont:
ist veraltet, verwenden Sie stattdessen sizeWithAttributes:
:
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
Die Verwendung von [label sizeToFit];
erzielt das gleiche Ergebnis von Daniels Category.
Obwohl ich empfehle, Autolayout zu verwenden und die Größe der Beschriftung basierend auf Einschränkungen ändern zu lassen.
Wenn wir möchten, dass UILabel
basierend auf der Textgröße verkleinert und erweitert wird, ist das Storyboard mit Autolayout die beste Option. Nachfolgend die Schritte, um dies zu erreichen
Setzen Sie UILabel in den View-Controller und platzieren Sie es wo immer Sie möchten. Fügen Sie auch 0
für die numberOfLines
-Eigenschaft von UILabel
ein.
Geben Sie ihm die Beschränkung für die obere, führende und nachlaufende Leerzeichen-Pin.
Update Frame
und klicken Sie auf Fix Misplacement
. Jetzt wird dieses UILabel verkleinert, wenn der Text kleiner ist, und erweitert, wenn der Text mehr ist.Dies ist nicht so kompliziert wie einige andere Antworten.
Verwenden Sie das automatische Layout, um Einschränkungen hinzuzufügen, um die linke und obere Seite des Etiketts zu fixieren.
Danach wird die Größe automatisch angepasst.
Bei Verwendung des automatischen Layouts muss keine sizeToFit
eingestellt werden. Mein vollständiger Code für das Beispielprojekt ist hier:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBAction func changeTextButtonTapped(sender: UIButton) {
myLabel.text = "my name is really long i want it to fit in this box"
}
}
myLabel.preferredMaxLayoutWidth = 150 // or whatever
im Code hinzu. (Ich habe meinen Knopf auch an der Unterseite des Etiketts fixiert, damit er sich nach unten bewegt, wenn die Etikettenhöhe ansteigt.)UITableViewCell
nach dynamischen Größenbeschriftungen suchen, dann sehen Sie diese Antwort .Verwenden Sie [label sizeToFit];
, um den Text in UILabel anzupassen
Ich habe einige Methoden basierend auf Daniels Antwort erstellt.
-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX);
CGSize expectedLabelSize = [text sizeWithFont:label.font
constrainedToSize:maximumLabelSize
lineBreakMode:label.lineBreakMode];
return expectedLabelSize.height;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label
{
CGRect newFrame = label.frame;
newFrame.size.height = [self heightForLabel:label withText:label.text];
label.frame = newFrame;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
label.text = text;
[self resizeHeightToFitForLabel:label];
}
@implementation UILabel (UILabel_Auto)
- (void)adjustHeight {
if (self.text == nil) {
self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, self.bounds.size.width, 0);
return;
}
CGSize aSize = self.bounds.size;
CGSize tmpSize = CGRectInfinite.size;
tmpSize.width = aSize.width;
tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];
self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, aSize.width, tmpSize.height);
}
@end
Dies ist eine Kategoriemethode. Sie müssen zuerst Text festlegen und dann diese Methode aufrufen, um die Höhe von UILabel anzupassen.
Sie können die Größe Ihres Etiketts anhand von Text und anderen zugehörigen Steuerelementen auf zwei Arten anpassen:
Für iOS 7.0 und höher
CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : labelFont
}
context:nil].size;
vor iOS 7.0 könnte dies zur Berechnung der Etikettengröße verwendet werden
CGSize labelTextSize = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
// Andere Steuerelemente basierend auf labelTextHeight umbenennen
CGFloat labelTextHeight = labelTextSize.height;
Wenn Sie die Größe des Textes der Beschriftung nicht berechnen möchten, können Sie -sizeToFit für die Instanz von UILabel as-
[label setNumberOfLines:0]; // for multiline label
[label setText:@"label text to set"];
[label sizeToFit];// call this to fit size of the label according to text
// Danach können Sie den Beschriftungsrahmen erhalten, um andere verwandte Steuerelemente umzubenennen
Hier finde ich Arbeiten für meine Situation:
1) Die Höhe des UILabels hat eine Einschränkung von> = 0 mit Autolayout. Die Breite ist festgelegt . 2) Weisen Sie den Text dem UILabel zu, das an dieser Stelle bereits einen Überblick hat (nicht sicher, wie wichtig das ist) . 3) Dann machen Sie:
label.sizeToFit()
label.layoutIfNeeded()
Die Höhe des Etiketts ist jetzt richtig eingestellt.
[label sizeToFit];
in viewDidLoad hinzuIch hatte große Probleme mit dem automatischen Layout. Wir haben zwei Container in der Tabellenzelle. Die Größe des zweiten Containers wird abhängig von der Artikelbeschreibung (0 - 1000 Zeichen) geändert, und die Zeilengröße sollte basierend auf ihnen angepasst werden.
Der fehlende Bestandteil war für die Beschreibung die unterste Einschränkung.
Ich habe die untere Einschränkung des dynamischen Elements von = 0 in> = 0 geändert.
sie können eine Zeilenausgabe anzeigen und dann die Eigenschaft Line = 0 und die Mehrfachausgabe anzeigen. Dann die Eigenschaft Line = 1 und mehr festlegen.
[self.yourLableName sizeToFit];
Passt immer! :)
name.text = @"Hi this the text I want to fit to"
UIFont * font = 14.0f;
CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
nameOfAssessment.font = [UIFont systemFontOfSize:font];