[英]how to replace sizeWithFont after it is deprecated on iOS 7
我有一個舊項目,並且代碼正在使用sizeWithFont。 我從xcode收到警告,說它在iOS 7中已被棄用,並要求我將其替換為
(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
我有兩個問題:
I.如果我不打算更改它,那又會怎樣? 它會崩潰我的應用程序,還是只是繞過已棄用的API?
二。 我想使用建議的API,但感到困惑的是它要求CGSize參數並返回CGRect,而我的舊項目只需要返回CGSize。 如果我已經有了CGSize,為什么還要再次使用rect? 請更正我,並使用新的API給出代碼。 非常感謝!
編輯:
我已經檢查了iOS 7中過時的sizeWithFont:替換中的答案嗎?
我將做一個自我回答,比較兩個解決方案。
我有另一個問題:
我注意到有一個[self setNumberOfLines:1];
,我應該保留它還是可以刪除它? 目前它不會影響我的代碼中的任何內容,但是我不知道其他情況,也就是“多行”情況。
舊的舊版代碼:
@implementation UILabel (dynamicSize)
-(CGFloat)expectedWidth{
[self setNumberOfLines:1];
CGSize maximumLabelSize = CGSizeMake(9999,self.frame.size.height);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
我將做一個自我回答,以比較iOS 7中過時的sizeWithFont中來自Replacement的兩個解決方案:
順便說一句,我不確定是否需要setNumberOfLines,所以我將其設置為無限制
[self setNumberOfLines:0];
一種解決方案是
CGSize size = [[self text] sizeWithAttributes:@{NSFontAttributeName: [self font]}];
// Values are fractional -- you should take the ceilf to get equivalent values
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
另一個:
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:[self text]
attributes:@{NSFontAttributeName: [self font]}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){CGFLOAT_MAX, CGFLOAT_MAX} // be careful here
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
兩種解決方案的結果都與棄用的API相同。 總結一下,我使用sizeWithAttributes,因為它更簡單。
但是要提到的一件事是:
iOS 7中過時的sizeWithFont替換中的答案: 使用(CGSize){width, CGFLOAT_MAX}];
作為大小參數,
但是我測試了是否使用了(CGSize){self.bounds.size.width, CGFLOAT_MAX}];
結果不正確,計算出的寬度小於其他解決方案。
如果使用(CGSize){CGFLOAT_MAX, CGFLOAT_MAX}
,我將得到與其他答案相同的結果。 在決定選擇解決方案之前,請測試您的代碼。
如果您的標簽需要根據文本大小更改寬度,則可以提供CGFLOAT_MAX的寬度,而如果您希望根據標簽中的文本高度更改,則可以提供CGFLOAT_MAX的高度。 另一個參數將是靜態的。
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:[self text]
//If Height is dynamic and width is fix, Eg.150 width fix, and height dynamic
CGRect rect = [attributedText boundingRectWithSize:(CGSize){150, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
// OR
//If width is dynamic and Height is fix, Eg.150 Height fix, and width dynamic
CGRect rect = [attributedText boundingRectWithSize:(CGSize){CGFLOAT_MAX,150}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
您將根據需要的標簽尺寸獲得動態的寬度,高度。
關於這兩種方法,有一些遺漏的概念,如果您正試圖獲取文本容器(如UITexView
或UILabel
,則此方法僅為您提供文本所占據的空間,而不是視圖所占據的空間,並且可以多行導致剪切的文本,例如, UITextView
包含一些填充,這些方法沒有考慮到這一點。
在添加文本后,在文本視圖上調用-sizeToFit
可以提供實際大小。
關於您的問題:
.size
里面CGRect
結構。 UILabel
將使用-linebreakMode
選擇的規則剪切文本,使用0表示沒有限制
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.