IOS 7 में, sizeWithFont:
अब पदावनत हो गया है। प्रतिस्थापन विधि में अब मैं UIFont ऑब्जेक्ट में कैसे पास करूं sizeWithAttributes:
?
IOS 7 में, sizeWithFont:
अब पदावनत हो गया है। प्रतिस्थापन विधि में अब मैं UIFont ऑब्जेक्ट में कैसे पास करूं 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
iOS 6 से फ़ंक्शन के लिए केवल एक आवरण है ।
कि नोट, यदि आप केवल iOS 6 और iOS 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
Apple डेवलपर साइट पर देख सकते हैं कि यह पदावनत है इसलिए हमें इसका उपयोग करने की आवश्यकता है 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:
और आपका जाना अच्छा है।
IOS7 में मुझे टेबलव्यू के लिए सही ऊंचाई वापस करने के लिए तर्क की आवश्यकता थी: heightForRowAtIndexPath विधि, लेकिन sizeWithAttributes हमेशा स्ट्रिंग की लंबाई की परवाह किए बिना एक ही ऊंचाई देता है क्योंकि यह नहीं जानता कि यह एक निश्चित चौड़ाई तालिका सेल में डाल दिया जाएगा। । मैंने पाया कि यह मेरे लिए बहुत अच्छा काम करता है और टेबल सेल की चौड़ाई को ध्यान में रखते हुए सही ऊँचाई की गणना करता है! यह ऊपर दिए गए मिस्टर टी के उत्तर पर आधारित है।
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 और NSParagraphStyle के साथ sizeWithAttributes का उपयोग कर सकते हैं।
आप पैराग्राफ शैली को परिभाषित करेंगे और इस तरह से एक एनएसडीआर का उपयोग करेंगे:
// 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];
यदि आप ऊंचाई की तलाश कर रहे हैं तो आप CGSize 'AdjustSize' या CGRect को rect.size.height प्रॉपर्टी के रूप में उपयोग कर सकते हैं।
NSParagraphStyle के बारे में अधिक जानकारी यहाँ: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class-Reference/Reference.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));
एक फ़ंक्शन बनाएं जो UILabel का उदाहरण लेता है। और 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];
}
@Bitand पर बिल्डिंग, यह एक नई विधि है जिसे मैंने अभी अपने NSString + अतिरिक्त श्रेणी में जोड़ा है:
- (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;
}
मैं सिर्फ परिणामी फ्रेम के आकार का उपयोग करता हूं।
आप अभी भी उपयोग कर सकते हैं sizeWithFont
। लेकिन, आईओएस में = = 7.0 विधि दुर्घटना का कारण बनती है यदि स्ट्रिंग में अग्रणी और अनुगामी स्थान या अंत रेखाएं होती हैं \n
।
उपयोग करने से पहले ट्रिमिंग पाठ
label.text = [label.text stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
यह भी लागू हो सकता है sizeWithAttributes
और [label sizeToFit]
।
इसके अलावा, जब भी आपके पास nsstringdrawingtextstorage message sent to deallocated instance
iOS 7.0 डिवाइस होता है, तो वह इससे निपटता है।
बेहतर उपयोग स्वचालित आयाम (स्विफ्ट):
tableView.estimatedRowHeight = 68.0
tableView.rowHeight = UITableViewAutomaticDimension
NB: 1. UITableViewCell प्रोटोटाइप को ठीक से डिज़ाइन किया जाना चाहिए (उदाहरण के लिए सेट को न भूलें UILabel.numberOfLines = 0 आदि) 2. HeightForRowAtIndexPath विधि निकालें
VIDEO: https://youtu.be/Sz3XfCsSb6k
Xamarin में स्वीकृत उत्तर होगा (आकार का उपयोग करें
UIStringAttributes attributes = new UIStringAttributes
{
Font = UIFont.SystemFontOfSize(17)
};
var size = text.GetSizeUsingAttributes(attributes);
@ आयुष जवाब के रूप में:
जैसा कि आप
sizeWithFont
Apple डेवलपर साइट पर देख सकते हैं कि यह पदावनत है इसलिए हमें इसका उपयोग करने की आवश्यकता है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}];
इसमें से किसी ने भी मेरे लिए ios 7 में काम नहीं किया। यहां मैंने वही किया जो मैंने किया। मैंने इसे अपने कस्टम सेल वर्ग में रखा और अपनी ऊँचाई में विधि को कॉल किया ।ForCellAtIndexPath विधि।
ऐप स्टोर में ऐप देखने पर मेरा सेल विवरण सेल के समान दिखता है।
स्टोरीबोर्ड में सबसे पहले, अपने लेबल को 'एट्रिब्यूट टेक्स्ट' पर सेट करें, लाइनों की संख्या 0 पर सेट करें (जो स्वचालित रूप से लेबल का आकार बदल देगा (ios 6+ केवल)) और इसे वर्ड रैप पर सेट करें।
फिर मैं सिर्फ अपने कस्टम सेल क्लास में सेल की सामग्री की सभी ऊंचाइयों को जोड़ता हूं। मेरे मामले में मेरे पास शीर्ष पर एक लेबल है जो हमेशा "विवरण" (_descriptionHeadingLabel) कहता है, एक छोटा लेबल जो आकार में परिवर्तनशील होता है जिसमें वास्तविक विवरण (_descriptionLabel) होता है जो कक्ष के शीर्ष से शीर्ष तक एक बाधा होता है (_descriptionHeadingLabelTopConstraint) । मैंने नीचे से थोड़ा सा स्पेस करने के लिए 3 भी जोड़ दिया (उपशीर्षक प्रकार के सेल पर समान मात्रा में सेब के स्थानों के बारे में)।
- (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
ios 9.2 वर्तमान समस्याओं में, ios <9.2 के विभिन्न परिणाम हैं। आपने इसे बनाने के लिए कोई अन्य सर्वोत्तम तरीका पाया या जाना।
NSString
aUILabel
( a के मामले में, लेकिन अक्सर ऐसा होता है) के साथ काम करते समय , आप इसके[UIFont systemFontOfSize:17.0f]
साथ प्रतिस्थापित भी कर सकते हैंlabel.font
- मौजूदा डेटा को संदर्भित करके कोड रखरखाव में मदद करता है बनाम आप इसे कई बार टाइप कर रहे हैं या सभी पर स्थिरांक का संदर्भ दे रहे हैं। जगह, आदि