iOS 7 sizeWithAttributes: Ersatz für sizeWithFont: ConstrainedToSize


132

Wie können Sie eine mehrzeilige Text-CGSize von der neuen iOS 7-Methode sizeWithAttributes zurückgeben?

Ich möchte, dass dies die gleichen Ergebnisse wie sizeWithFont: beschränkteToSize liefert.

NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eu urna quis lacus imperdiet scelerisque a nec neque. Mauris eget feugiat augue, vitae porttitor mi. Curabitur vitae sollicitudin augue. Donec id sapien eros. Proin consequat tellus in vehicula sagittis. Morbi sed felis a nibh hendrerit hendrerit. Lorem ipsum dolor sit."

CGSize textSize = [text sizeWithAttributes:@{ NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0] }];

Diese Methode erzeugt nur die Höhe für eine einzelne Textzeile.



6
+1 für die gleiche Schriftart wie ich :)
Lescai Ionel

Antworten:


293

Nun, Sie können dies versuchen:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]};
// NSString class method: boundingRectWithSize:options:attributes:context is
// available only on ios7.0 sdk.
CGRect rect = [textToMeasure boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:attributes
                                          context:nil];

4
Zum ersten Mal sehe ich diese Notation für Wörterbücher @{...}. Wie heißt es?
Martin Berger

4
Bro, ich verlor fast mein Vertrauen in SO, dann kam ich hierher.
NSPunk

21
Beeindruckend. So viel stumpfer als die ursprüngliche sizeWithFont:constrainedToSize:Methode, die veraltet war. Apple muss uns wirklich hassen. In jedem Fall +1.
Aroth

1
Warum benutzt du MAXFLOATstatt CGFLOAT_MAX?
Julian F. Weinert

19
var size = textToMeasure.boundingRectWithSize( CGSizeMake(width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes:attrs, context:nil).size
Schnelle

23

So habe ich es gemacht:

    // Get a font to draw it in
UIFont *font = [UIFont boldSystemFontOfSize: 28];

CGRect textRect;
NSDictionary *attributes = @{NSFontAttributeName: font};

// How big is this string when drawn in this font?
textRect.size = [text sizeWithAttributes:attributes];

// Draw the string
[text drawInRect:textRect withAttributes:attributes];

2
Dies funktioniert nicht, wenn eine lange Zeichenfolge am Zeilenende unterbrochen werden soll. Lesen Sie die richtige Antwort von elio.d.
Julian F. Weinert

4

Swift 2.3:

let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)]
let rect = NSString(string: textToMeasure).boundingRectWithSize(
        CGSizeMake(width, CGFLOAT_MAX), 
        options: NSStringDrawingOptions.UsesLineFragmentOrigin, 
        attributes: attributes, context: nil)

Swift 4:

let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)]
let rect = NSString(string: textToMeasure).boundingRect(
                    with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude),
                    options: NSStringDrawingOptions.usesLineFragmentOrigin,
                    attributes: attributes as [NSAttributedString.Key : Any], context: nil)

3

Hier ist meine Methode, um mit beiden Situationen umzugehen, geht in eine NSStringKategorie.

- (CGSize) sizeWithFontOrAttributes:(UIFont *) font {
    if (IS_IOS7) {
        NSDictionary *fontWithAttributes = @{NSFontAttributeName:font};
        return [self sizeWithAttributes:fontWithAttributes];
    } else {
        return [self sizeWithFont:font];
    }
}

3

Für Xamarin.iOS:

UIFont descriptionLabelFont =  UIFont.SystemFontOfSize (11);
NSString textToMeasure = (NSString)DescriptionLabel.Text;

CGRect labelRect = textToMeasure.GetBoundingRect (
    new CGSize(this.Frame.Width, nfloat.MaxValue), 
    NSStringDrawingOptions.UsesLineFragmentOrigin, 
    new UIStringAttributes () { Font = descriptionLabelFont }, 
    new NSStringDrawingContext ()
);

2

Wenn Sie den Text, die Schriftart, numberOfLines und die Breite Ihres Etikettensatzes festgelegt haben, gibt diese Methode die Größe Ihres Etiketts zurück:

myLabel.numberOfLines = 0;

CGSize size = [myLabel sizeThatFits:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)];`

1

Alternativ UITextViewkönnen Sie immer die folgende NSLayoutManagerMethode verwenden:

CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;

Sie können die Zeilenhöhe für eine bestimmte Schriftart auch ermitteln, indem Sie:

UIFont *font;
CGFloat lineHeight = font.lineHeight;

0

[Als neuer Benutzer kann ich keinen Kommentar zur Antwort von @ testing veröffentlichen, aber um seine Antwort (für xamarin.ios) nützlicher zu machen]

Wir können ein CGRect zurückgeben und nur den Höhenparameter für das GUI-Element verwenden, auf das wir UIButton usw. abzielen. Geben Sie alle Parameter ein, die wir wie unten benötigen

    public CGRect GetRectForString(String strMeasure, int fontSize, nfloat guiItemWidth)
    {
        UIFont descriptionLabelFont =  UIFont.SystemFontOfSize (fontSize);
        NSString textToMeasure = (NSString)strMeasure;

        CGRect labelRect = textToMeasure.GetBoundingRect (
            new CGSize(guiItemWidth, nfloat.MaxValue), 
            NSStringDrawingOptions.UsesLineFragmentOrigin, 
            new UIStringAttributes () { Font = descriptionLabelFont }, 
            new NSStringDrawingContext ()
        );

        return labelRect;
    }

        header_Revision.Frame = new CGRect (5
                                            , verticalAdjust
                                            , View.Frame.Width-10
                                            , GetRectForString( header_Revision.Title(UIControlState.Normal)
                                                              , 18
                                                              , View.Frame.Width-10 ).Height
                                            );

Dies sollte eigentlich unter dem netten Code für Xamarin.IOS sein :) Hoffe, es hilft jedem :)
Matt

Wenn Sie mehr Wiederholungen haben, wird ein Kommentar wie dieser normalerweise an den Beitrag angehängt. Sie können das noch nicht tun, also danke für zusätzliche Daten und willkommen bei Stack Overflow.
Stuart Siegler

0
CGSize stringsize = [lbl.text sizeWithAttributes:
                         @{NSFontAttributeName:[UIFont fontWithName:FontProximaNovaRegular size:12.0]}];


CGSize adjustedSize = CGSizeMake(ceilf(stringsize.width), ceilf(stringsize.height));

Verwenden Sie die ceilfMethode, um ordnungsgemäß zu verwalten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.