簡體   English   中英

在iOS 7棄用后如何替換sizeWithFont

[英]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];

您將根據需要的標簽尺寸獲得動態的寬度,高度。

關於這兩種方法,有一些遺漏的概念,如果您正試圖獲取文本容器(如UITexViewUILabel ,則此方法僅為您提供文本所占據的空間,而不是視圖所占據的空間,並且可以多行導致剪切的文本,例如, UITextView包含一些填充,這些方法沒有考慮到這一點。
在添加文本后,在文本視圖上調用-sizeToFit可以提供實際大小。
關於您的問題:

  1. 棄用意味着可能會在將來的iOS版本中中斷,保留一段時間通常並不重要,但是我強烈建議您對其進行更改,以更新代碼,請注意,如果您部署的iOS目標包括新API,您的應用將在該特定iOS版本中崩潰
  2. 只需使用.size里面CGRect結構。
  3. 這是可能的最大行數,如果不合適, UILabel將使用-linebreakMode選擇的規則剪切文本,使用0表示沒有限制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM