iOS 7 sizeWithAttributes: sizeWithFont के बदले: constrainedToSize


132

आप नए iOS 7 विधि sizeWithAttributes से एक बहुस्तरीय पाठ CGSize कैसे लौटाते हैं?

मैं चाहूंगा कि यह उसी तरह का परिणाम देगा जैसा कि sizeWithFont: constrainedToSize।

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] }];

यह विधि केवल पाठ की एक पंक्ति के लिए ऊँचाई पैदा करती है।


इस पर एक नज़र डालें: stackoverflow.com/questions/18673176/…

6
+1 मेरे जैसा ही फॉन्ट होने के लिए :)
लेसकाई इओनेल

जवाबों:


293

अच्छी तरह से आप यह कोशिश कर सकते हैं:

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
पहली बार मैंने शब्दकोशों के लिए यह अंकन देखा @{...}। इसे क्या कहते है?
मार्टिन बर्गर

4
भाई, मैं एसओ में अपना विश्वास लगभग खो रहा था, फिर मैं यहां आया।
NSPunk

21
वाह। मूल sizeWithFont:constrainedToSize:विधि की तुलना में बहुत अधिक obtuse कि पदावनत किया गया था। Apple को वास्तव में हमसे घृणा करनी चाहिए। किसी भी मामले में, +1।
अरोठ

1
MAXFLOATइसके बजाय आप का उपयोग क्यों करते हैं CGFLOAT_MAX?
जूलियन एफ वेइनर्ट

19
स्विफ्ट संस्करण:var size = textToMeasure.boundingRectWithSize( CGSizeMake(width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes:attrs, context:nil).size
mdziadkowiec

23

मैंने इस तरह से इसे किया:

    // 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
यह काम नहीं करेगा यदि लाइन के अंत में एक लंबी स्ट्रिंग टूटनी चाहिए। Elio.d के उत्तर का संदर्भ लें, जो सही है।
जूलियन एफ वेइनर्ट

4

स्विफ्ट 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)

स्विफ्ट 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

यहां दोनों स्थितियों से निपटने का मेरा तरीका एक NSStringश्रेणी में जाता है ।

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

3

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

यदि आपके पास अपने लेबल सेट का टेक्स्ट, फ़ॉन्ट, नंबरऑफलाइन और चौड़ाई है, तो यह विधि आपके लेबल का आकार लौटाती है:

myLabel.numberOfLines = 0;

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

1

एक विकल्प के रूप में, यदि आप देख रहे हैं, तो आप UITextViewहमेशा NSLayoutManagerविधि का उपयोग कर सकते हैं :

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

आप किसी दिए गए फ़ॉन्ट के लिए लाइन ऊंचाई भी पा सकते हैं:

UIFont *font;
CGFloat lineHeight = font.lineHeight;

0

[एक नए उपयोगकर्ता के रूप में, मैं @ परीक्षण के उत्तर के लिए एक टिप्पणी पोस्ट नहीं कर सकता, लेकिन उसका जवाब देने के लिए (xamarin.ios के लिए) और अधिक पढ़ें]

हम एक CGRect वापस कर सकते हैं और केवल उस आइटम के लिए ऊंचाई पैरामीटर का उपयोग कर सकते हैं जिसे हम UIButton इत्यादि को लक्षित कर रहे हैं। किसी भी पैरामीटर में नीचे दिए गए अनुसार हमें आवश्यकता है

    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
                                            );

यह वास्तव में Xamarin.IOS के लिए परीक्षण के अच्छे कोड के तहत होना चाहिए था। :) उम्मीद है कि यह किसी को भी मदद करता है :)
मैट

जब आपके पास अधिक प्रतिनिधि हों, तो इस तरह की टिप्पणी आम तौर पर पोस्ट में जोड़ दी जाएगी। आप अभी तक ऐसा नहीं कर सकते, इसलिए अतिरिक्त डेटा के लिए धन्यवाद, और स्टैक ओवरफ्लो में आपका स्वागत है।
स्टुअर्ट सीगलर

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


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

ceilfउचित तरीके से प्रबंधित करने के लिए विधि का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.