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.

Morcutt
quelle
Schauen Sie sich das an: stackoverflow.com/questions/18673176/…
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];
oiledCode
quelle
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];
Gnawbone
quelle
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)
Gelee
quelle
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];
    }
}
Dan Rosenstark
quelle
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 ()
);
testen
quelle
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)];`
Marijn
quelle
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;
mikeho
quelle
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
                                            );
Matt
quelle
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

jenish
quelle