আইওএস 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.