6

アプリを iOS 7 にアップデートして、ようやく入手できましたが、解決策が見つからないことが 1 つあります。

Xcode 4 では、次の方法を使用しました。

#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:options:attributes:context: を使用します。

以前のバージョンをこの新しい方法に変換する方法がわかりません。誰か助けていただければ幸いです。前もって感謝します。

4

3 に答える 3

5

sizeWithFontメソッドは iOS7 で廃止されました。代わりに、 boundingRectWithSizeを使用する必要があります。以前の iOS バージョンもサポートする必要がある場合は、次のコードを使用できます。

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];
}
于 2013-09-18T19:06:18.937 に答える
4

ios6 以降のみをサポートしている場合は、 を に変換してNSStringsNSAttributedStrings使用できNSAttributedStringますboundingRectWithSize:options:context:

以前は次のように見えました。

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 に属しており、sizeWithFont:...2 つのスレッドで同時に実行するとクラッシュしていました。iOS6 では、新しい NSStringDrawing 関数NSAttributedStringsが公開され、boundingRectWithSize:...関数はスレッドセーフです。これが、ios7で古いsizeWithFont:...機能が廃止された理由だと思います。

ドキュメントの言及に注意してください:

iOS 7 以降では、このメソッドは分数のサイズを返します (返された CGRect のサイズ コンポーネントで)。返されたサイズをビューのサイズに使用するには、ceil 関数を使用してその値を最も近い整数に上げる必要があります。

したがって、ビューのサイズ変更に使用する計算された高さまたは幅を引き出すには、次を使用します。

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);
于 2013-09-22T15:05:40.500 に答える
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];
于 2013-09-16T18:49:53.853 に答える