2013-09-16 6 views
6

私のアプリをiOS 7にアップデートしていますが、最終的にそれを入手しましたが、解決策が見つからないことが1つあります。 Xcodeの4ではsizeWithFont:constrainedToSize:lineBreakMode:iOS7で廃止されました

私は次のメソッドを使用:

#define FONT_SIZE 14.0f 
#define CELL_CONTENT_WIDTH 280.0f 
#define CELL_CONTENT_MARGIN 10.0f 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { 
    NSString *text = [textA objectAtIndex:[indexPath row]]; 

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

    CGFloat height = MAX(size.height, 28.0f); 

    return height + (CELL_CONTENT_MARGIN * 2); 
} 

をしかし、iOSの7でそれを使用しているとき、私はエラーを取得します:

使用-boundingRectWithSize:オプション:属性:コンテキスト:

私は以前のバージョンをこの新しい方法に変換する方法がわかりません。私を怒らせてください。前もって感謝します。

答えて

5

sizeWithFont方法はiOS7で非推奨されました。代わりにboundingRectWithSizeを使用してください。あなただけios6サポートしている場合は

CGSize size = CGSizeZero; 

if ([label.text respondsToSelector: @selector(boundingRectWithSize:options:attributes:context:)] == YES) { 
    size = [label.text boundingRectWithSize: constrainedSize options: NSStringDrawingUsesLineFragmentOrigin 
           attributes: @{ NSFontAttributeName: label.font } context: nil].size; 
} else { 
    size = [label.text sizeWithFont: label.font constrainedToSize: constrainedSize lineBreakMode: UILineBreakModeWordWrap]; 
} 
2

sizeWithFont APIは、iOS7で廃止されました。

// See UIStringDrawing.h 
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:"); // NSTextAlignment is not needed to determine size 

あなたはそうのようなAPIの提案を使用することができます。

NSMutableDictionary *atts = [[NSMutableDictionary alloc] init]; 
[atts setObject:myFont forKey:NSFontAttributeName]; 

CGRect rect = [myText boundingRectWithSize:constraint 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:atts 
           context:nil]; 
4

以降、あなたのNSStringsNSAttributedStringsに変換し、NSAttributedStringboundingRectWithSize:options:context:を使用することができます:あなたはまた、以前のiOSバージョンをサポートする必要があるなら、あなたは以下のコードを使用することができます。

CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){maxWidth, CGFLOAT_MAX}]; 

が簡単ios6とios7の両方で、この仕事に変換することでした::サイドノートとして

NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
     initWithString:text 
     attributes:@ 
     { 
      NSFontAttributeName: font 
     }]; 
CGRect rect = [attributedText boundingRectWithSize:(CGSize){maxWidth, CGFLOAT_MAX} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
CGSize size = rect.size; 

、この物事の利益を前に、このように見えた

何かios6のテキストサイジングはスレッドセーフなのでsizeWithFont:...の古いメソッドはUIStringDrawingに属していました。これは、同時に2つのスレッドでsizeWithFont:...を実行した場合にクラッシュします。 ios6では、NSAttributedStringsの新しいNSStringDrawing関数が公開され、boundingRectWithSize:...関数はスレッドセーフです。私はこれがios7で古いsizeWithFont:...関数が推奨されなくなった理由を推測しています。

ドキュメントが言及注意:iOSの7で

を以降では、この方法は、(返さCGRectのサイズ 成分中)小数のサイズを返します。戻りサイズを使用して ビューを表示するには、ceil関数を使用して、その値を最も近い上位整数 に上げる必要があります。

だから私が使用する、ビューのサイズを設定するために使用されるように計算され、高さや幅を引き出す:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
関連する問題