1

テーブルのセルに動的な高さを設定しようとしています。高さは、テキストの長さと最大幅に基づいている必要があります。

問題は、このテキストが行区切りなしで 1 行に収まっている場合に発生します。テキストの大きさに関係なく、行セパレーターがない場合、テキストが 1 行に収まることが検出されるため、セルの高さが増加しません。

私は何か間違ったことをしていますか?どうすれば達成できますか?ありがとう。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    CGFloat cellheight = 35.0f; // BASE

    NSString *text = @"...";

    if (text) {
    UIFont *font = (indexPath.row == 0) ? [UIFont systemFontOfSize:14] : [UIFont systemFontOfSize:12]; 
    CGSize constraintSize = CGSizeMake(self.tableView.frame.size.width, CGFLOAT_MAX);

    if (IS_EARLIER_THAN_IOS7) {
        CGSize size = [text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:NSLineBreakByCharWrapping];
        cellheight += size.height;
    } else {
        CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:12.0f]}];

        CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
        cellheight += adjustedSize.height;
    }
    return (indexPath.row == 0) ? cellheight + 40.0f : cellheight;
}  

}

4

2 に答える 2

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

「sizeWithAttributes:」ではなく「boundingRectWithSize:options:attributes:context:」を使用する必要があります。

これはサンプルです

CGSize size = [text boundingRectWithSize:CGSizeMake(_myTableView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size;
于 2016-01-14T09:32:08.423 に答える
2

それを行うためのより簡単な方法があります:

最初にテキストを にUILabel設定し、必要なすべてのフォント、サイズを設定します。sizeThatFitsなど。次に、ラベルのメソッドを呼び出します。

CGSize sizze =[itemLabel sizeThatFits:CGSizeMake(itemNameLabelWidth, CGFLOAT_MAX)];

また、呼び出す前にnumberOfLinesandを設定することを忘れないでくださいlineBreakModesizeThatFits:

itemLabel.numberOfLines=0;
itemLabel.lineBreakMode=NSLineBreakByWordWrapping;

注1:呼び出しsizeThatFitsは新しいフレームをUILabelに設定せず、新しいフレームを計算して返すだけです。次に、x と y の原点値を追加して、フレームをラベルに設定する必要があります。したがって、次のようになります。

CGSize sizze =[itemLabel sizeThatFits:CGSizeMake(itemNameLabelWidth, CGFLOAT_MAX)];
CGRect namelabelFrame = itemLabel.frame;
namelabelFrame.size = sizze;
itemLabel.frame = namelabelFrame;

注 2 : このコードは で問題ありませんがcellForRowAtIndexPath:、内部の高さを計算するときに、heightForRowAtIndexPath:このコードを少し最適化する必要がある場合があります。操作するセルがないため、UILabelオブジェクトを初期化し、このコードを実行して高さを推定できます。ただし、スクロール中のパフォーマンスに大きな影響を与える可能性があるため、UIView内部で初期化を行うことはお勧めできません。heightForRowAtIndexPath:

UILabelしたがって、クラス変数として既に初期化されている (およびすべての書式設定が適用されている)を持ち、それを高さの計算に再利用します。

于 2016-01-14T08:57:42.440 に答える