আইওএস 7 এ, sizeWithFont:
এখন অবচয় করা হয়েছে। আমি কীভাবে এখন ইউআইএফন্ট অবজেক্টে প্রতিস্থাপন পদ্ধতিতে পাস করব sizeWithAttributes:
?
আইওএস 7 এ, sizeWithFont:
এখন অবচয় করা হয়েছে। আমি কীভাবে এখন ইউআইএফন্ট অবজেক্টে প্রতিস্থাপন পদ্ধতিতে পাস করব sizeWithAttributes:
?
উত্তর:
sizeWithAttributes:
পরিবর্তে ব্যবহার করুন, যা এখন একটি গ্রহণ করে NSDictionary
। কী UITextAttributeFont
এবং আপনার ফন্টের অবজেক্টটির সাথে জোড়াটি পাস করুন :
CGSize size = [string sizeWithAttributes:
@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
// Values are fractional -- you should take the ceilf to get equivalent values
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
boundingRectWithSize:options:attributes:context:
পরিবর্তে CGSizeMake(250.0f, CGFLOAT_MAX)
বেশিরভাগ ক্ষেত্রেই ব্যবহার করবেন।
আমি বিশ্বাস করি যে ফাংশনটি অবচিত করা হয়েছে কারণ সেই সিরিজের NSString+UIKit
ফাংশনগুলি ( sizewithFont:...
ইত্যাদি) UIStringDrawing
লাইব্রেরির উপর ভিত্তি করে ছিল, যা থ্রেডটি নিরাপদ ছিল না। যদি আপনি এগুলি মূল থ্রেডে না চালানোর চেষ্টা করেন (অন্য কোনও UIKit
কার্যকারিতার মতো), আপনি অনির্দেশ্য আচরণ পাবেন। বিশেষত, আপনি যদি একসাথে একাধিক থ্রেডে ফাংশনটি চালিয়ে যান তবে এটি সম্ভবত আপনার অ্যাপ্লিকেশনটি ক্রাশ করবে। এই কারণেই আইওএস 6 এ তারা একটি boundingRectWithSize:...
পদ্ধতি চালু করেছিল NSAttributedString
। এটি NSStringDrawing
লাইব্রেরির উপরে নির্মিত হয়েছিল এবং থ্রেড নিরাপদ।
আপনি যদি নতুন NSString
boundingRectWithSize:...
ফাংশনটি দেখুন তবে এটি একটি হিসাবে একই পদ্ধতিতে একটি বৈশিষ্ট্য অ্যারে জিজ্ঞাসা করবে NSAttributeString
। যদি আমার অনুমান করতে হয়, NSString
আইওএস 7-এ এই নতুন ফাংশনটি NSAttributeString
আইওএস 6 থেকে ফাংশনটির জন্য কেবল একটি মোড়ক ।
যে নোট অন, আপনি শুধুমাত্র আইওএস 6 এবং আইওএস 7 সমর্থনকারী করা হয়েছে, অতঃপর আমি স্পষ্টভাবে আপনার সব পরিবর্তন হবে NSString
sizeWithFont:...
থেকে NSAttributeString
boundingRectWithSize
। যদি আপনি একটি অদ্ভুত মাল্টি-থ্রেডিং কর্নার কেস হয়ে থাকেন তবে এটি আপনার প্রচুর মাথা ব্যাথা বাঁচাবে! আমি কীভাবে রূপান্তর করেছি তা এখানে NSString
sizeWithFont:constrainedToSize:
:
কি ব্যবহৃত হত:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];
এর সাথে প্রতিস্থাপন করা যেতে পারে:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc] initWithString:text
attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
ডকুমেন্টেশন উল্লেখ নোট করুন:
আইওএস 7 এবং তারপরে, এই পদ্ধতিটি ভগ্নাংশের আকার দেয় (প্রত্যাবর্তনের আকারের উপাদানটিতে
CGRect
); আকারের আকারে কোনও প্রত্যাবর্তিত আকার ব্যবহার করতে, আপনাকে অবশ্যই সিল ফাংশনটি ব্যবহার করে নিকটতম উচ্চতর পূর্ণসংখ্যার কাছে এর মান বাড়াতে হবে।
আকারের আকারগুলি ব্যবহারের জন্য গণনা করা উচ্চতা বা প্রস্থটি টানতে আমি ব্যবহার করব:
CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);
আপনি যেমন sizeWithFont
অ্যাপল বিকাশকারী সাইটে দেখতে পাচ্ছেন এটি হ্রাস পেয়েছে সুতরাং আমাদের ব্যবহার করা উচিত sizeWithAttributes
।
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
NSString *text = @"Hello iOS 7.0";
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
// code here for iOS 5.0,6.0 and so on
CGSize fontSize = [text sizeWithFont:[UIFont fontWithName:@"Helvetica"
size:12]];
} else {
// code here for iOS 7.0
CGSize fontSize = [text sizeWithAttributes:
@{NSFontAttributeName:
[UIFont fontWithName:@"Helvetica" size:12]}];
}
[NSObject respondsToSelector:]
: এখান মত পদ্ধতি stackoverflow.com/a/3863039/1226304
আমি এই সমস্যাটি পরিচালনা করতে একটি বিভাগ তৈরি করেছি, এটি এখানে:
#import "NSString+StringSizeWithFont.h"
@implementation NSString (StringSizeWithFont)
- (CGSize) sizeWithMyFont:(UIFont *)fontToUse
{
if ([self respondsToSelector:@selector(sizeWithAttributes:)])
{
NSDictionary* attribs = @{NSFontAttributeName:fontToUse};
return ([self sizeWithAttributes:attribs]);
}
return ([self sizeWithFont:fontToUse]);
}
এইভাবে আপনাকে কেবল খুঁজে পেতে / প্রতিস্থাপন sizeWithFont:
করতে হবে sizeWithMyFont:
এবং আপনি যেতে ভাল good
আইওএস 7-এ আমি টেবিল ভিউয়ের জন্য সঠিক উচ্চতা ফিরিয়ে আনার জন্য যুক্তিটির প্রয়োজন ছিল: উচ্চতারওআউটইন্ডেক্সপথ পদ্ধতিটি, তবে আকারের সাথে লেখাগুলি স্ট্রিং দৈর্ঘ্য নির্বিশেষে সর্বদা একই উচ্চতা ফেরত দেয় কারণ এটি জানে না যে এটি একটি নির্দিষ্ট প্রস্থের টেবিলের ঘরে স্থাপন করতে চলেছে । আমি এটি আমার জন্য দুর্দান্ত কাজ পেয়েছি এবং টেবিলের ঘরের প্রশস্ততা বিবেচনা করে সঠিক উচ্চতা গণনা করছি! এটি উপরের মিঃ টি এর উত্তরের ভিত্তিতে।
NSString *text = @"The text that I want to wrap in a table cell."
CGFloat width = tableView.frame.size.width - 15 - 30 - 15; //tableView width - left border width - accessory indicator - right border width
UIFont *font = [UIFont systemFontOfSize:17];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
size.height = ceilf(size.height);
size.width = ceilf(size.width);
return size.height + 15; //Add a little more padding for big thumbs and the detailText label
ডায়নামিক উচ্চতা ব্যবহার করে মাল্টি-লাইন লেবেলগুলিকে আকারটি সঠিকভাবে সেট করতে অতিরিক্ত তথ্যের প্রয়োজন হতে পারে। আপনি উভয় ফন্ট এবং লাইন-ব্রেক মোড নির্দিষ্ট করতে UIFont এবং NSParaographicStyle এর সাথে আকারেরঅ্যাট্রিবিউট ব্যবহার করতে পারেন।
আপনি অনুচ্ছেদের স্টাইলটি সংজ্ঞায়িত করবেন এবং এনএসডিকোরিয়ানের মতো ব্যবহার করুন:
// set paragraph style
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:NSLineBreakByWordWrapping];
// make dictionary of attributes with paragraph style
NSDictionary *sizeAttributes = @{NSFontAttributeName:myLabel.font, NSParagraphStyleAttributeName: style};
// get the CGSize
CGSize adjustedSize = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
// alternatively you can also get a CGRect to determine height
CGRect rect = [myLabel.text boundingRectWithSize:adjustedSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:sizeAttributes
context:nil];
আপনি যদি উচ্চতার সন্ধান করেন তবে আপনি সিজি সাইজ 'অ্যাডজাস্টেড সাইজ' বা সিজিআরেক্টটিকে rect.size.height সম্পত্তি হিসাবে ব্যবহার করতে পারেন।
এনএসপারাগ্রাফ স্টাইল সম্পর্কে আরও তথ্য এখানে: https://developer.apple.com/library/mac/docamentation/cocoa/references/applicationkit/classes/NSParaographicStyle_Class/References/References.html
// max size constraint
CGSize maximumLabelSize = CGSizeMake(184, FLT_MAX)
// font
UIFont *font = [UIFont fontWithName:TRADE_GOTHIC_REGULAR size:20.0f];
// set paragraph style
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
// dictionary of attributes
NSDictionary *attributes = @{NSFontAttributeName:font,
NSParagraphStyleAttributeName: paragraphStyle.copy};
CGRect textRect = [string boundingRectWithSize: maximumLabelSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil];
CGSize expectedLabelSize = CGSizeMake(ceil(textRect.size.width), ceil(textRect.size.height));
এমন একটি ফাংশন তৈরি করুন যা কোনও ইউআইএলবেল উদাহরণ গ্রহণ করে। এবং CGSize প্রদান করে
CGSize constraint = CGSizeMake(label.frame.size.width , 2000.0);
// Adjust according to requirement
CGSize size;
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0){
NSRange range = NSMakeRange(0, [label.attributedText length]);
NSDictionary *attributes = [label.attributedText attributesAtIndex:0 effectiveRange:&range];
CGSize boundingBox = [label.text boundingRectWithSize:constraint options: NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
}
else{
size = [label.text sizeWithFont:label.font constrainedToSize:constraint lineBreakMode:label.lineBreakMode];
}
return size;
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
বিকল্প সমাধান-
CGSize expectedLabelSize;
if ([subTitle respondsToSelector:@selector(sizeWithAttributes:)])
{
expectedLabelSize = [subTitle sizeWithAttributes:@{NSFontAttributeName:subTitleLabel.font}];
}else{
expectedLabelSize = [subTitle sizeWithFont:subTitleLabel.font constrainedToSize:subTitleLabel.frame.size lineBreakMode:NSLineBreakByWordWrapping];
}
@ বিটস এন্ড বিল্ডিং, এটি একটি নতুন পদ্ধতি যা আমি স্রেফ আমার এনএসএসটিং + অতিরিক্ত বিভাগে যুক্ত করেছি:
- (CGRect) boundingRectWithFont:(UIFont *) font constrainedToSize:(CGSize) constraintSize lineBreakMode:(NSLineBreakMode) lineBreakMode;
{
// set paragraph style
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:lineBreakMode];
// make dictionary of attributes with paragraph style
NSDictionary *sizeAttributes = @{NSFontAttributeName:font, NSParagraphStyleAttributeName: style};
CGRect frame = [self boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin attributes:sizeAttributes context:nil];
/*
// OLD
CGSize stringSize = [self sizeWithFont:font
constrainedToSize:constraintSize
lineBreakMode:lineBreakMode];
// OLD
*/
return frame;
}
আমি কেবল ফলাফল ফ্রেমের আকার ব্যবহার করি use
আপনি এখনও ব্যবহার করতে পারেন sizeWithFont
। তবে, আইওএস> = 7.0 পদ্ধতিতে ক্র্যাশ হওয়ার কারণ যদি স্ট্রিংটিতে শীর্ষস্থানীয় এবং পিছনের জায়গাগুলি বা শেষ লাইন থাকে \n
।
এটি ব্যবহার করার আগে পাঠ্য ছাঁটাই করা
label.text = [label.text stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
এটিও প্রয়োগ হতে পারে sizeWithAttributes
এবং [label sizeToFit]
।
এছাড়াও, আপনি যখনই nsstringdrawingtextstorage message sent to deallocated instance
আইওএস 7.0 ডিভাইসে থাকবেন তখন এটি এটির সাথে ডিল করে।
আরও ভাল ব্যবহার স্বয়ংক্রিয় মাত্রা (সুইফ্ট):
tableView.estimatedRowHeight = 68.0
tableView.rowHeight = UITableViewAutomaticDimension
এনবি: ১. ইউআইটিএবলভিউসেল প্রোটোটাইপটি সঠিকভাবে ডিজাইন করা উচিত (উদাহরণস্বরূপ UILabel.numberOfLines = 0 ইত্যাদি সেট করতে ভুলবেন না) 2. হাইটফোরআরোএটিডেক্সপথ পদ্ধতিটি সরান
ভিডিও: https://youtu.be/Sz3XfCsSb6k
জামারিনে গৃহীত উত্তরগুলি হ'ল (মাপের আকারবিজ্ঞাপন এবং ইউআইটিেক্সটঅ্যাট্রিবিউটফন্ট ব্যবহার করুন):
UIStringAttributes attributes = new UIStringAttributes
{
Font = UIFont.SystemFontOfSize(17)
};
var size = text.GetSizeUsingAttributes(attributes);
@ আয়ুষ উত্তর হিসাবে:
আপনি যেমন
sizeWithFont
অ্যাপল বিকাশকারী সাইটে দেখতে পাচ্ছেন এটি হ্রাস পেয়েছে সুতরাং আমাদের ব্যবহার করা উচিতsizeWithAttributes
।
ঠিক আছে, ধরুন যে 2019+ এ আপনি সম্ভবত সুইফট ব্যবহার করছেন এবং String
অবজেক্টিভ-সি এর পরিবর্তে এবং NSString
এখানে সঠিক উপায়ে String
পূর্বনির্ধারিত ফন্টের আকারের আকার পাবেন :
let stringSize = NSString(string: label.text!).size(withAttributes: [.font : UIFont(name: "OpenSans-Regular", size: 15)!])
- (CGSize) sizeWithMyFont:(UIFont *)fontToUse
{
if ([self respondsToSelector:@selector(sizeWithAttributes:)])
{
NSDictionary* attribs = @{NSFontAttributeName:fontToUse};
return ([self sizeWithAttributes:attribs]);
}
return ([self sizeWithFont:fontToUse]);
}
যদি কারও এটির প্রয়োজন হয় তবে মনোোটুচ সমতুল্য:
/// <summary>
/// Measures the height of the string for the given width.
/// </summary>
/// <param name="text">The text.</param>
/// <param name="font">The font.</param>
/// <param name="width">The width.</param>
/// <param name="padding">The padding.</param>
/// <returns></returns>
public static float MeasureStringHeightForWidth(this string text, UIFont font, float width, float padding = 20)
{
NSAttributedString attributedString = new NSAttributedString(text, new UIStringAttributes() { Font = font });
RectangleF rect = attributedString.GetBoundingRect(new SizeF(width, float.MaxValue), NSStringDrawingOptions.UsesLineFragmentOrigin, null);
return rect.Height + padding;
}
যা এটির মতো ব্যবহার করা যেতে পারে:
public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
//Elements is a string array
return Elements[indexPath.Row].MeasureStringHeightForWidth(UIFont.SystemFontOfSize(UIFont.LabelFontSize), tableView.Frame.Size.Width - 15 - 30 - 15);
}
CGSize maximumLabelSize = CGSizeMake(label.frame.size.width, FLT_MAX);
CGSize expectedLabelSize = [label sizeThatFits:maximumLabelSize];
float heightUse = expectedLabelSize.height;
এই বাক্য গঠন চেষ্টা করুন:
NSAttributedString *attributedText =
[[NSAttributedString alloc] initWithString:text
attributes:@{NSFontAttributeName: font}];
আইওএস this এ এর কোনওটিই আমার পক্ষে কাজ করেনি Here আমি এটিকে আমার কাস্টম সেল শ্রেণিতে রেখেছি এবং আমার উচ্চতাের জন্য কলটিঅ্যাক্টেক্সেক্স পদ্ধতিতে call
অ্যাপ স্টোরটিতে একটি অ্যাপ্লিকেশন দেখার সময় আমার ঘর বিবরণ কলের মতো দেখায়।
স্টোরিবোর্ডে প্রথমে আপনার লেবেলটিকে 'অ্যাট্রিবিউটটেক্সট' তে সেট করুন, লাইনের সংখ্যা 0 তে সেট করুন (যা স্বয়ংক্রিয়ভাবে লেবেলের আকার পরিবর্তন করবে (কেবলমাত্র আইওএস 6+) এবং ওয়ার্ড র্যাপে সেট করবে।
তারপরে আমি কেবলমাত্র আমার কাস্টম সেল শ্রেণিতে কক্ষের সামগ্রীর সমস্ত উচ্চতা যুক্ত করেছি। আমার ক্ষেত্রে আমার শীর্ষে একটি লেবেল রয়েছে যা সর্বদা "বিবরণ" (_ডেস্ক্রিপশন হিডিংলাবেল) বলে, এটি একটি ছোট লেবেল যা আকারে পরিবর্তনশীল যা আসল বিবরণ (_ডেস্ক্রিপশন লেবেল) কক্ষের শীর্ষ থেকে শিরোনাম (_descriptHeadingLabelTopConstraint) পর্যন্ত একটি সীমাবদ্ধ থাকে । আমি নীচে সামান্য কিছুটা জায়গা জুড়েছি (সাবটাইটেল টাইপ কোষে সমান পরিমাণ অ্যাপল জায়গাগুলি))
- (CGFloat)calculateHeight
{
CGFloat width = _descriptionLabel.frame.size.width;
NSAttributedString *attributedText = _descriptionLabel.attributedText;
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} options: NSStringDrawingUsesLineFragmentOrigin context:nil];
return rect.size.height + _descriptionHeadingLabel.frame.size.height + _descriptionHeadingLabelTopConstraint.constant + 3;
}
এবং আমার টেবিল ভিউ প্রতিনিধিতে:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
if (indexPath.row == 0) {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"descriptionCell"];
DescriptionCell *descriptionCell = (DescriptionCell *)cell;
NSString *text = [_event objectForKey:@"description"];
descriptionCell.descriptionLabel.text = text;
return [descriptionCell calculateHeight];
}
return 44.0f;
}
আপনি যদি বিবৃতিটিকে কিছুটা 'স্মার্ট' হিসাবে পরিবর্তন করতে পারেন এবং প্রকৃতপক্ষে কোনও ধরণের ডেটা উত্স থেকে সেল সনাক্তকারী পান। আমার ক্ষেত্রে কক্ষগুলি হার্ড কোডিং হতে চলেছে কারণ সেগুলির একটি নির্দিষ্ট ক্রমে নির্দিষ্ট পরিমাণ থাকবে।
boundingRectWithSize
আইওএস 9.2 বর্তমান সমস্যার মধ্যে আইওএস <9.2 এর বিভিন্ন ফলাফল। এটি তৈরি করার জন্য আপনি অন্য কোনও সেরা উপায় খুঁজে পেয়েছেন বা জানেন।
NSString
এবংUILabel
(সব সময় নয় ক্ষেত্রে, কিন্তু প্রায়ই তাই), সদৃশ কোড / ইত্যাদি প্রতিরোধ, এছাড়াও আপনি প্রতিস্থাপন করতে পারেন[UIFont systemFontOfSize:17.0f]
সঙ্গেlabel.font
- বনাম আপনি বিদ্যমান তথ্য উল্লেখ এটা একাধিক বার টাইপ বা সব ধ্রুবক আখ্যা কোড রক্ষণাবেক্ষণ সাহায্য করে স্থান, ইত্যাদি