আইওএস 7 আকারবিহীনঅ্যাট্রিবিউটস: মাপের প্রতিস্থাপন


132

নতুন আইওএস 7 পদ্ধতির আকার থেকে কীভাবে আপনি একাধিক পাঠ্য সিজি সাইজ ফেরত পাঠান?

আমি আকার-উইথফন্ট: কনস্ট্রেইনড টোসাইজের মতো একই ফলাফল আনতে চাই।

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
ভাই, আমি প্রায় আমার বিশ্বাস হারিয়ে ফেলছিলাম, তারপরে আমি এখানে এসেছি।
— এনএসপঙ্ক

21
কি দারুন. মূল sizeWithFont:constrainedToSize:পদ্ধতির তুলনায় এত বেশি অবচেতন that অ্যাপল অবশ্যই আমাদের ঘৃণা করবে। যে কোনও ক্ষেত্রে, +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

সুইফট ২.৩:

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 জন্য) আরও দরকারী করতে]

আমরা একটি সিজিআরেক্টটি ফিরে আসতে পারি এবং কেবল ইউআইবাটন ইত্যাদি লক্ষ্যবস্তু করা গি আইটেমের জন্য কেবল উচ্চতার পরামিতি ব্যবহার করতে পারি any

    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 এর জন্য পরীক্ষার দুর্দান্ত কোডের অধীনে থাকার কথা ছিল :) আশা করি এটি যে কাউকে সহায়তা করবে :)
— ম্যাট

আপনার যদি আরও প্রতিনিধি থাকে, সাধারণত একটি পোস্ট পোস্টে যুক্ত করা হবে app আপনি এখনও এটি করতে পারবেন না, তাই অতিরিক্ত ডেটার জন্য ধন্যবাদ, এবং স্ট্যাক ওভারফ্লোতে স্বাগতম।
— স্টুয়ার্ট সিগেলার

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


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

ceilfসঠিকভাবে পরিচালনা করতে পদ্ধতি ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.