0

各フィールドのテキストの長さに応じて高さが動的に変化する字幕スタイルのUITableViewCellがあります。問題は、ラベルに複数の行がある場合、textLabelの高さ(CGSizeサイズ)が増加しないことです。

http://s10.postimg.org/6urher7s9/text_Label.png

奇妙な部分は、detailTextLabelの高さが必要に応じて増加していることです(CGSizesize2)。両方の高さを計算するコードは同じです。

http://s21.postimg.org/m0af4gyw7/detail.png

これが私の関数です:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    SETLISTFMNS0Song *song = [[[selectedSetlist.sets objectAtIndex:indexPath.section] songs]objectAtIndex:indexPath.row];
    CGSize size = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)];
    NSLog(@"Label: \"%@\" \tLabel Size: %f W %f H", song.name, size.width, size.height);

    NSMutableString *detail;
    if ([song cover]) {
        detail = [[NSMutableString alloc] initWithFormat:@"(%@ cover)", [[song cover] name]];
    }
    if ([song with]) {
        if (!detail) {
            detail = [[NSMutableString alloc] initWithFormat:@"(with %@)", [[song with] name]];
        }
        else {
            [detail appendFormat:@" (with %@)", [[song with] name]];
        }
    }
    if ([song info]) {
        if (!detail) {
            detail = [[NSMutableString alloc] initWithFormat:@"(%@)", [song info]];
        }
        else {
            [detail appendFormat:@" (%@)", [song info]];
        }
    }

    if (detail.length != 0) {
        CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX)];
        size.height += size2.height;
        NSLog(@"Detail Label: \"%@\" \tDetail Label Size: %f W %f H", detail, size2.width, size2.height);
    }

    return size.height + 5;
}

また、cellForRowAtIndexPathで両方のtextLabelのnumberOfLinesプロパティを0に設定して、複数の行をサポートしています。

cell.textLabel.numberOfLines = 0;
cell.detailTextLabel.numberOfLines = 0;

更新: @joshのおかげで、なぜこれが起こっているのか理解できました。幅の制約をUITableViewの幅に設定しました。これは幅が広すぎます。UILabelを作成する前に幅を見つける方法を知っている人はいますか?HA!

ありがとう!

4

2 に答える 2

1

サイズを計算している文字列の長さはどれくらいですか?関数がセルの全幅に制限されているので質問しますsizeWithFont:constrainedToSize:が、ラベルはおそらくセルの全幅ではありません。

私が起こっているsong.infoのは、行がセルの全幅である場合に1行に収まるほど短いことと、曲detailが正しい行数を計算するのに十分な長さであると思われることですが、計算された高さを超えます。

つまり、あなたがしなければならないことは、textLabelとの幅を見つけて、detailTextLabelそれらの値に制約を設定することだと思います。

更新-ラベル幅を計算する方法

セル内のラベルの幅はセルの幅に依存し、セルheightForRowAtIndexPath:は呼び出された時点では作成されないため、幅の前にラベルの幅を知る方法を考え出す必要があります。設定されています。これを行う唯一の方法は、自分で幅を設定することです。これが私がそれをする方法です:

MyCell.h

#import <UIKit/UIKit.h>

@interface MyCell : UITableViewCell

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth;

@end

MyCell.m

#import "MyCell.h"

@implementation MyCell

- (void)layoutSubviews {
    [super layoutSubviews];

    CGRect frame = self.textLabel.frame;
    frame.size.width = [MyCell textLabelWidthForCellOfWidth:self.frame.size.width];
    self.textLabel.frame = frame;
}

+ (CGFloat)textLabelWidthForCellOfWidth:(CGFloat)cellWidth {
    // This calculation can be as complex as necessary to account for all elements that affect the label
    return cellWidth - 20;
}

@end

次に、heightForRowAtIndexPath:実装で同じクラスメソッドを呼び出すことができます。

CGFloat labelWidth = [MyCell textLabelWidthForCellOfWidth:self.tableView.frame.size.width]; // Since non-grouped cells are the full width of the tableView
CGSize size2 = [detail sizeWithFont:[UIFont fontWithName:setlistFont size:detailFontSize] constrainedToSize:CGSizeMake(labelWidth, CGFLOAT_MAX)];

参照する必要のあるラベルごとに、個別のクラスメソッド(+)を作成します。

于 2013-03-27T09:15:37.793 に答える
0

コードを見ると、「lineBreakMode」を定義するのに欠けていることがわかりました。

CGSize theSize = [song.name sizeWithFont:[UIFont fontWithName:setlistFont size:labelFontSize] constrainedToSize:CGSizeMake(self.setsTable.bounds.size.width, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];

これでコードを更新します。それがあなたの問題を解決することを願っています。幸運を

于 2013-03-27T17:42:13.337 に答える