wake-up-neo.com

Das dynamische Abrufen der Höhe von UILabel gemäß Text ergibt unterschiedliche Werte für iOS 7.0 und iOS 6.1

Ich verwende diese Methode, um die Höhe des UILabel dynamisch zu ermitteln:

+(CGSize) GetSizeOfLabelForGivenText:(UILabel*)label Font:(UIFont*)fontForLabel Size:  (CGSize)LabelSize{
    label.numberOfLines = 0;
    CGSize labelSize = [label.text sizeWithFont:fontForLabel constrainedToSize:LabelSize lineBreakMode:NSLineBreakByCharWrapping];
    return (labelSize);
}

Mit dieser Lösung erhalte ich die genaue Größe von UILabel, wenn mein Code unter iOS 8 ausgeführt wird Wenn ich jedoch meine Anwendung unter iOS7 ausführen, wird ein anderer Wert zurückgegeben.

23
Sumeet Mourya

Sie müssen den Rahmen wie folgt dynamisch setzen:

//Compatible for both ios6 and ios7.  

CGSize constrainedSize = CGSizeMake(self.resizableLable.frame.size.width  , 9999);

NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [UIFont fontWithName:@"HelveticaNeue" size:11.0], NSFontAttributeName,
                                      nil];

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"textToShow" attributes:attributesDictionary];

CGRect requiredHeight = [string boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];

if (requiredHeight.size.width > self.resizableLable.frame.size.width) {
    requiredHeight = CGRectMake(0,0, self.resizableLable.frame.size.width, requiredHeight.size.height);
}
CGRect newFrame = self.resizableLable.frame;
newFrame.size.height = requiredHeight.size.height;
self.resizableLable.frame = newFrame;
26
preetam

Hier ist eine Gesamtlösung für Breite und Höhe. Fügen Sie diese in Ihre AppDelegate ein:

+(void)fixHeightOfThisLabel:(UILabel *)aLabel
{
    aLabel.frame = CGRectMake(aLabel.frame.Origin.x,
                              aLabel.frame.Origin.y,
                              aLabel.frame.size.width,
                              [AppDelegate heightOfTextForString:aLabel.text
                                                         andFont:aLabel.font
                                                         maxSize:CGSizeMake(aLabel.frame.size.width, MAXFLOAT)]);
}

+(CGFloat)heightOfTextForString:(NSString *)aString andFont:(UIFont *)aFont maxSize:(CGSize)aSize
{
    // iOS7
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        CGSize sizeOfText = [aString boundingRectWithSize: aSize
                                                  options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                               attributes: [NSDictionary dictionaryWithObject:aFont
                                                                                       forKey:NSFontAttributeName]
                                                  context: nil].size;

        return ceilf(sizeOfText.height);
    }

    // iOS6
    CGSize textSize = [aString sizeWithFont:aFont
                          constrainedToSize:aSize
                              lineBreakMode:NSLineBreakByWordWrapping];
    return ceilf(textSize.height;
}

+(void)fixWidthOfThisLabel:(UILabel *)aLabel
{
    aLabel.frame = CGRectMake(aLabel.frame.Origin.x,
                              aLabel.frame.Origin.y,
                                [AppDelegate widthOfTextForString:aLabel.text
                                                          andFont:aLabel.font
                                                          maxSize:CGSizeMake(MAXFLOAT, aLabel.frame.size.height)],
                              aLabel.frame.size.height);
}

+(CGFloat)widthOfTextForString:(NSString *)aString andFont:(UIFont *)aFont maxSize:(CGSize)aSize
{
    // iOS7
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        CGSize sizeOfText = [aString boundingRectWithSize: aSize
                                                  options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                               attributes: [NSDictionary dictionaryWithObject:aFont
                                                                                       forKey:NSFontAttributeName]
                                                  context: nil].size;

        return ceilf(sizeOfText.width);
    }

    // iOS6
    CGSize textSize = [aString sizeWithFont:aFont
                          constrainedToSize:aSize
                              lineBreakMode:NSLineBreakByWordWrapping];
    return ceilf(textSize.width);
}

um dies zu verwenden, legen Sie den Text der Beschriftung fest:

label.numberOfLines = 0;
label.text = @"Everyone loves Stack OverFlow";

und Ruf an:

[AppDelegate fixHeightOfThisLabel:label];

Hinweis: numberOfLines der Beschriftung muss auf 0 gesetzt werden.

5
Andrew Bennett

wenn Sie eine der Systemschriftarten verwenden, wurden diese in iOS 7 geändert, sodass sie unterschiedliche Größen haben.


Außerdem ist sizeWithFont:constrainedToSize:lineBreakMode: in iOS 7 veraltet. Verwenden Sie sizeWithAttributes: (wenn Sie sich auf iOS 7 befinden)

4
liamnichols

Die akzeptierte Antwort hat mich nicht befriedigt, also musste ich dies in meinem Code feststellen:

CGSize possibleSize = [string sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:10] //font you are using
                          constrainedToSize:CGSizeMake(skillsMessage.frame.size.width,9999)
                              lineBreakMode:NSLineBreakByWordWrapping];


CGRect newFrame = label.frame;
newFrame.size.height = possibleSize.height;
label.frame = newFrame;
2
stackOverFlew

Die akzeptierte Antwort ist zu lang. Sie können Folgendes verwenden:

+(CGSize) GetSizeOfLabelForGivenText:(UILabel*)label Font:(UIFont*)fontForLabel Size:  (CGSize) constraintSize{
    label.numberOfLines = 0;
    CGRect labelRect = [label.text boundingRectWithSize:constraintSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:fontForLabel} context:nil];
    return (labelRect.size);
}
1
Armin

Ich benutze die ganze Zeit sizeThatFits:

CGRect frame = myLabel.frame;
CGSize constraint = CGSizeMake(CGRectGetWidth(myLabel.frame), 20000.0f);
CGSize size = [myLabel sizeThatFits:constraint];
frame.size.height = size.height;
myLabel.frame = frame;

Sie können es versuchen

1
Js Lim

Unabhängig von der Höhe, die ich über diesen Code bekomme (Methode, die ich oben in dieser Frage geschrieben habe). Er gibt die Höhe in Gleitkommazahl (86.4) an, sobald wir das bekommen und versuchen, diese Höhe auf UILabel zu setzen um den Wert aus der Höhe mit ceiling (87) anstelle des Werts zu erhalten, da es (86.4) ist. Ich habe mein Problem mit diesem Ansatz gelöst. Und danke für deine Antworten.

0
Sumeet Mourya

Diese Methode wird von iOS 7 bis iOS 11.4 von mir verwendet und getestet

+ (CGFloat)getLabelHeight:(UILabel*)label
{
    NSParameterAssert(label);
    CGSize limitLabel = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize labelBox = [label.text boundingRectWithSize: limitLabel
                                                  options: NSStringDrawingUsesLineFragmentOrigin
                                               attributes: @{ NSFontAttributeName:label.font }
                                                  context: context].size;

    size = CGSizeMake(ceil(labelBox.width), ceil(labelBox.height));
    return size.height;
}

So kannst du folgendes verwenden:

CGFloat sizeOfFontTest = 12.0;
    UILabel *testLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, 0, 100, 0)];
    [testLabel setFont: [UIFont systemFontOfSize: sizeOfFontTest]];
    [testLabel setText: @"Hello Stackoverflow Large String Example"];

    CGFloat heightTestLabel = [self getLabelHeight: testLabel];

    [testLabel setFrame: CGRectMake(testLabel.frame.Origin.x, testLabel.frame.Origin.y, testLabel.frame.size.width, heightAddrsLab)];
    [testLabel setNumberOfLines: sizeOfFontTest / heightTestLabel];
0
Ladd.c

Super einfach. Holen Sie sich einfach den Bereich des Textes, teilen Sie ihn nach Breite und runden Sie ihn dann auf die nächste Höhe auf, die zu Ihrer Schrift passt.

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:font}];
    CGFloat area = size.height * size.width;
    CGFloat height = roundf(area / width);
    return ceilf(height / font.lineHeight) * font.lineHeight;
}

Eine Plug & Play-Lösung. Ich verwende es häufig in einer Hilfsklasse, insbesondere für UITableViewCells mit dynamischer Größe.

Hoffe das hilft anderen in der Zukunft!

0
AlexKoren

Das ist es, worauf ich schließlich gekommen bin und hoffe, dass dies Ihnen helfen wird. Ich habe die iOS-Version wie Apple selbst im iOS 7 UI Transition Guide überprüft, in dem die Foundation Framework-Version überprüft wird, und mit #pragma die Warnung "Deprecated:" mit "- (CGSize) sizeWithFont" unterdrückt : (UIFont *) Schriftart constrainedToSize: (CGSize) Größe ".

+ (CGSize)getStringBoundingSize:(NSString*)string forWidth:(CGFloat)width withFont:(UIFont*)font{

    CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX);
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
        // for iOS 6.1 or earlier
        // temporarily suppress the warning and then turn it back on
        // since sizeWithFont:constrainedToSize: deprecated on iOS 7 or later
        #pragma clang diagnostic Push
        #pragma clang diagnostic ignored "-Wdeprecated-declarations"
            maxSize = [string sizeWithFont:font constrainedToSize:maxSize];
        #pragma clang diagnostic pop

    } else {
        // for iOS 7 or later
        maxSize = [string sizeWithAttributes:@{NSFontAttributeName:font}];

    }
    return maxSize;
}
0

Ich habe eine Situation, in der ich die Höhe der Beschriftung dynamisch an den Text anpassen muss. Ich verwende Xcode 7.1 und mein Projekt-Implementierungsziel ist 7.0, aber ich habe es auf dem iOS 9-Simulator getestet, und die folgende Lösung funktioniert für mich. Hier ist die Lösung: Zuerst wird ein Wörterbuch wie folgt erstellt:

NSDictionary *attributes = @{NSFontAttributeName:self.YOUR_LABEL.font};

jetzt berechnen wir die Höhe und Breite für unseren Text und übergeben das neu erstellte Wörterbuch.

    CGRect rect = [YOUR_TEXT_STRING boundingRectWithSize:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:attributes
                                          context:nil];

Dann setzen wir den Rahmen für unser LABEL:

    self.YOUR_LABEL.frame = CGRectMake(self.YOUR_LABEL.frame.Origin.x, self.YOUR_LABEL.frame.Origin.y, self.YOUR_LABEL.frame.size.width, rect.size.height);

DIESES IS WIE ICH ERFOLGREICH DEN RAHMEN MEINES LABELS NACH TEXT ERFOLGT.

0
Zulqarnain

Die Methode sizeWithFont:constrainedToSize:lineBreakMode: ist in iOS7 veraltet. Sie sollten stattdessen sizeWithAttributes: verwenden.

Beispiel:

NSDictionary *fontAttributes = @{NSFontAttributeName : [UIFont systemFontOfSize:15]};
CGSize textSize = [self.myLabel.text sizeWithAttributes:fontAttributes];
CGFloat textWidth = textSize.width;
CGFloat textHeight = textSize.height;
0
Groot