অবহেলিত-সাইজওয়েথফন্টের জন্য প্রতিস্থাপন: কনস্ট্রেইনড টো সাইজ: লাইনব্র্যাকমোড: আইওএস 7 এ?


146

আইওএস 7-তে, পদ্ধতি:

- (CGSize)sizeWithFont:(UIFont *)font
     constrainedToSize:(CGSize)size
         lineBreakMode:(NSLineBreakMode)lineBreakMode 

এবং পদ্ধতি:

- (CGSize)sizeWithFont:(UIFont *)font

অবচয় করা হয়। আমি কীভাবে প্রতিস্থাপন করতে পারি

CGSize size = [string sizeWithFont:font
                 constrainedToSize:constrainSize
                     lineBreakMode:NSLineBreakByWordWrapping];

এবং:

CGSize size = [string sizeWithFont:font];

2
বিকল্প পদ্ধতিটি হ'ল -sizeWithAttributes:
হোলএক্স

ঠিক আছে হোলএক্স ধন্যবাদ তবে, আমি কীভাবে এনএসডিআইক্রিটারির মতো লেবেল থেকে একটি ফন্ট ব্যবহার করতে পারি? যদি আমার কোডটি এর মতো হয়: সাইজ উইথফন্ট: কাস্টমেলবেল.ফন্ট; শূন্যটি জিজ্ঞাসা করুন "আকারবিহীনঅ্যাট্রিবিউটস: <# (এনএসডেটরি *) #>" "
ব্যবহারকারী_ডেনিস_ মোস্তাজো

1
আপনি কীভাবে বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে পারেন তার অফিসিয়াল ডকুমেন্টেশন এখানে রয়েছে: developer.apple.com/library/ios/docamentation/UIKit/References/…
राहील

উত্তর:


219

আপনি এটি চেষ্টা করতে পারেন:

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:FONT}
                                 context:nil];

CGSize size = textRect.size;

একটি "[ইউআইফোন্ট ফন্ট ....]" এর জন্য কেবল "ফন্ট" পরিবর্তন করুন


13
এবং কোথায় আপনি এনএসলাইনব্র্যাকবাই ওয়ার্ড ওয়ার্ডিংয়ের কথা উল্লেখ করবেন? কোথায় গেল?
user4951

32
NSLineBreakByWordWrappingএকটি মধ্যে যেতে হবে NSParagraphStyle। উদাহরণস্বরূপ: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;বৈশিষ্ট্যগুলিতে আপনাকে তখন যুক্ত করতে হবে NSParagraphStyleAttributeName: paragraphStyle.copy...
ফ্লোরিয়ান ফ্রিডরিখ

1
আমার ক্ষেত্রে @ ফ্রাইড এনএসলাইনব্রেইকবাই ওয়ার্ড ওয়ার্ল্ড র্যাপিং ব্যতীত লাইন ব্রেকের সাথে প্যারাগ্রাটি স্টাইল যুক্ত করার ফলে মাত্র এক লাইনের জন্য আকার গণনা করা হয়েছে ... কোনও চিন্তা?
manicaesar

9
ভুলে যাবেন না যে boundingRectWithSize:options:attributes:context:ভগ্নাংশের মানগুলি দেয়। আসল উচ্চতা / প্রস্থটি পেতে আপনাকে যথাক্রমে করতে হবে ceil(textRect.size.height)এবং ceil(textRect.size.width)করতে হবে।
ফ্লোরিয়ান ফ্রিডরিচ

20
হোলটি কী বলিভিসাইজ হয়?
জেআরএম 13

36

যেহেতু আমরা ৪.৩ এর বেশি আইওএসের সমস্ত আকারের জন্য আকার ব্যবহার করতে পারি না আমাদের .0.০ এবং পূর্ববর্তী আইওএসের শর্তসাপেক্ষ কোড লিখতে হবে।

1) সমাধান 1:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
   CGSize size = CGSizeMake(230,9999);
   CGRect textRect = [specialityObj.name  
       boundingRectWithSize:size
                    options:NSStringDrawingUsesLineFragmentOrigin
                 attributes:@{NSFontAttributeName:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14]}
                    context:nil];
   total_height = total_height + textRect.size.height;   
}
else {
   CGSize maximumLabelSize = CGSizeMake(230,9999); 
   expectedLabelSize = [specialityObj.name sizeWithFont:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; //iOS 6 and previous. 
   total_height = total_height + expectedLabelSize.height;
}

2) সমাধান 2

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // Your Font-style whatever you want to use.
gettingSizeLabel.text = @"YOUR TEXT HERE";
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

প্রথম সমাধানটি কখনও কখনও উচ্চতার যথাযথ মানটি ফিরিয়ে দিতে ব্যর্থ হয়। সুতরাং অন্য সমাধান ব্যবহার করুন। যা নিখুঁতভাবে কাজ করবে।

দ্বিতীয় বিকল্পটি বেশ ভাল এবং শর্তাধীন কোড ব্যতীত সমস্ত আইওএসে সহজেই কাজ করছে।


1
230, 999 কেন? আপনি কোথায় নম্বর পাবেন>
ব্যবহারকারীর 4951

1
230 যে কোনও সংখ্যা হতে পারে। এটি আপনার লেবেলের জন্য আপনি যে প্রস্থটি চান তা উপস্থাপন করে। 9999 আমি বরং INFINITY বা MAXFLOAT দিয়ে প্রতিস্থাপন করব।
ফ্লোরিয়ান ফ্রিডরিচ

দ্বিতীয় সমাধান একটি কবজ মত কাজ করছে। ধন্যবাদ নীরভ।
জিম

1
"[অ্যাপহ্যান্ডার্স zHandler]" একটি ত্রুটি দেয় .. "অঘোষিত শনাক্তকারী"। কীভাবে সমাধান করবেন?
ডিম্পল

9

এখানে সহজ সমাধান:

প্রয়োজনীয়তা:

CGSize maximumSize = CGSizeMake(widthHere, MAXFLOAT);
UIFont *font = [UIFont systemFontOfSize:sizeHere];

এখন যেমন আইওএস 7.0constrainedToSizeusage:lineBreakMode:ব্যবহারের অবমূল্যায়ন করা হয়েছে :

CGSize expectedSize = [stringHere sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];

আইওএস 7.0 এর বৃহত্তর সংস্করণে এখন ব্যবহার হবে:

// Let's make an NSAttributedString first
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:stringHere];
//Add LineBreakMode
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
[attributedString setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, attributedString.length)];
// Add Font
[attributedString setAttributes:@{NSFontAttributeName:font} range:NSMakeRange(0, attributedString.length)];

//Now let's make the Bounding Rect
CGSize expectedSize = [attributedString boundingRectWithSize:maximumSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;

7

নীচে দুটি সহজ পদ্ধতি যা এই দুটি অবহেলা পদ্ধতি প্রতিস্থাপন করবে।

এবং এখানে সম্পর্কিত উল্লেখ রয়েছে:

আপনি যদি NSLineBreakByWordWrapping ব্যবহার করে থাকেন তবে আপনাকে এনএসপারাগ্রাফ স্টাইল নির্দিষ্ট করার দরকার নেই, এটি ডিফল্ট হিসাবে: https://developer.apple.com/library/mac/docamentation/Cocoa/References/ অ্যাপ্লিকেশনকিট / ক্লাসস / এনএসপারাগ্রাটি স্টাইল_ক্লাস / ইনডেক্স । এইচটিএমএল # // apple_ref / OCC / CLM / NSParagraphStyle / defaultParagraphStyle

অবহেলিত পদ্ধতির ফলাফলগুলির সাথে মেলে আপনার অবশ্যই আকারের সিলটি পেতে হবে। https://developer.apple.com/library/ios/docamentation/UIKit/References/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context :

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font {    
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];
    return CGSizeMake(ceilf(size.width), ceilf(size.height));
}

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
    CGRect textRect = [text boundingRectWithSize:size
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:@{NSFontAttributeName: font}
                                     context:nil];
    return CGSizeMake(ceilf(textRect.size.width), ceilf(textRect.size.height));
}

6

বেশিরভাগ ক্ষেত্রে আমি পদ্ধতির আকারটি ব্যবহার করেছি উইথফন্ট: কনস্ট্রেন্ডডটসাইজ: লাইনব্রেকমোড: কোনও ইউআইএলবেলের পাঠ্য সংযুক্ত করার জন্য সর্বনিম্ন আকারের অনুমান করার জন্য (বিশেষত যখন লেবেলটি ইউআইটিএবলভিউসিলের অভ্যন্তরে স্থাপন করা যেতে পারে) ...

... এটি ঠিক আপনার পরিস্থিতিটি থাকলে আপনি পদ্ধতিটি সহজভাবে ব্যবহার করতে পারেন:

CGSize size = [myLabel textRectForBounds:myLabel.frame limitedToNumberOfLines:mylabel.numberOfLines].size;

আশা করি এটি সাহায্য করবে।


5
অ্যাপলের ডকুমেন্টেশন বলছে যে আপনার এই পদ্ধতিটি সরাসরি কল করা উচিত নয়।
বারলো টাকার

কমপক্ষে আইওএস 7 এসডিকে ডকুমেন্টেশনে উল্লেখ নেই।
রিভেরা

3
UIFont *font = [UIFont boldSystemFontOfSize:16];
CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil];
CGSize stringSize= new.size;

3
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। আবার একই উত্তর পোস্ট করবেন না। আপনার যদি উত্তরে কিছু যুক্ত করতে হয় তবে একটি মন্তব্য করুন বা উত্তরে একটি সম্পাদনা করুন।
রামরাজ টি

ঠিক আছে .. আমি পরের বার এটি বিবেচনা করব। আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ।
ব্যবহারকারী 3575114

2

[গৃহীত উত্তরগুলি একটি বিভাগে দুর্দান্তভাবে কাজ করে। আমি অবহেলা পদ্ধতির নামগুলি ওভাররাইট করছি। এই একটি ভাল ধারণা? এক্সকোড x.x এ কোনও অভিযোগ না নিয়েই কাজ করছেন বলে মনে করছেন]

যদি আপনার স্থাপনার লক্ষ্য 7.0 বা তার বেশি হয় তবে এটি কাজ করে। বিভাগ হয়NSString (Util)

NSString + + Util.h

- (CGSize)sizeWithFont:(UIFont *) font;
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;

NSString + + Util.m

- (CGSize)sizeWithFont:(UIFont *) font {
    NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
    return [self sizeWithAttributes:fontAsAttributes];
}

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size {
    NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
    CGRect retVal = [self boundingRectWithSize:size
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:fontAsAttributes context:nil];
    return retVal.size;
}

0
UIFont *font = [UIFont fontWithName:@"Courier" size:16.0f];

NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
paragraphStyle.alignment = NSTextAlignmentRight;

NSDictionary *attributes = @{ NSFontAttributeName: font,
                    NSParagraphStyleAttributeName: paragraphStyle };

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:attributes
                                 context:nil];

CGSize size = textRect.size;

দুটি উত্তর থেকে 1 + 2

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