web-dev-qa-db-ja.com

UILabelのサイズを調整しますか?

IPhone Developer's Cookbookの第6章の「09a-PrefsTable」レシピから、次のスニペット(tableView:cellForRowAtIndexPath:UITableViewControllerメソッド内)をどのように変更しますか。

if (row == 1) { 
    // Create a big Word-wrapped UILabel 
    cell = [tableView dequeueReusableCellWithIdentifier:@"libertyCell"]; 
    if (!cell) { 
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"libertyCell"] autorelease]; 
        [cell addSubview:[[UILabel alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 280.0f, 330.0f)]]; 
    } 
    UILabel *sv = [[cell subviews] lastObject]; 
    sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; 
    sv.textAlignment = UITextAlignmentCenter; 
    sv.lineBreakMode = UILineBreakModeWordWrap; 
    sv.numberOfLines = 9999; 
    return cell; 
} 

...「sv」UILabelサブビューと「cell」UITableViewCellのサイズを、テキストに合わせて十分に大きくする(および、多かれ少なかれテキストと他の種類のテキスト配置で動作する) UILabelのtextRectForBounds:limitedToNumberOfLines:メソッドを調べましたが、ドキュメントでは、直接呼び出すことはできません(オーバーライドするだけでよい)と記載されています。 UIView sizeToFitメソッドを試しましたが、成功しませんでした。

Update:NSString -sizeWithFont:forWidth:lineBreakMode:メソッドの問題について新しい質問をしました

43
Daryl Spitzer

UILabelを拡張して私のためにそれを行うには、これを十分に行う必要がありました。

@interface UILabel (BPExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth;
@end

@implementation UILabel (BPExtensions)


- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth
{
    self.frame = CGRectMake(self.frame.Origin.x, self.frame.Origin.y, fixedWidth, 0);
    self.lineBreakMode = NSLineBreakByWordWrapping;
    self.numberOfLines = 0;
    [self sizeToFit];
}
@end

次に、ラベルに複数行の高さを可変にするが、幅を固定するだけです。

[myLabel sizeToFitFixedWidth:kSomeFixedWidth];

98
BadPirate

NSStringの-sizeWithFont:forWidth:lineBreakMode:メソッドを使用して、ラベルの関連するサイジングメトリックを取得する必要があります。

17
Lily Ballard

また、そのコードを使用する場合は、numberOfLinesプロパティを0に変更します。

10
Sophie Alpert

NSString-sizeWithFont:forWidth:lineBreakMode:は、実際にはワードラップを実行しません。代わりに、-sizeWithFont:constrainedToSize:lineBreakMode:文字列の正確な幅と高さの値を取得します。

5
pix0r

これを試して:

sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; 
sv.textAlignment = UITextAlignmentCenter; 
sv.lineBreakMode = UILineBreakModeWordWrap; 
sv.numberOfLines = 0;
[sv sizeToFit]; 
4
Sebastian

また、UITableViewDelegateメソッドを実装する必要があります。

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

そして、サイズ変更されたテキストフィールドに合わせて調整された合計セルの高さを返します。

もう1つの注意点-前述のように行数が0に設定されている場合、実際にフィットするサイズが実際に機能するはずです。ラベルに設定されたWordでラップされたテキストに合わせて高さを増やし、元のラベルの幅に合わせて幅を設定したサイズを戻します。

ただし、セルを取得する前にheightForRowのサイズを取得する必要があるため、これは役に立ちません。したがって、必要な高さを計算することをお勧めします。

ここに私が使用するコードのビットがあります:

CGSize textSize = [myLabel.text sizeWithFont:myLabel.font];
1
Chris

同様の問題がありました。これを解決しました。

CellForRowAtIndexPathメソッドで、フォントサイズを任意に設定します。

cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;    
[cell.textLabel setFont:[UIFont systemFontOfSize:14.0]];
[cell.textLabel sizeToFit];

また、heightForRowAtIndexPathメソッドでは、フォントサイズを大きくします。

    CGFloat height;

    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    NSString *text = cell.detailTextLabel.text;
    CGSize constraint = CGSizeMake(320, 20000.0f);
    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:20.0]     constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
    CGFloat calHeight = MAX(size.height, 44.0f);
    height =  calHeight + (CELL_CONTENT_MARGIN * 2);

    return height;
0
iPhoneDev

同様の問題があり、StoryBoardsで静的セルとして設計されたUITableViewCellがありました。 [super tableView:cellForRowAtIndexPath:]を使用して取得しました。そのため、設定したテキストに合うようにUILabel "detailTextLabel"のサイズを変更したかったのです。スタイルは「Right Detail」でした。

tableView:cellForRowAtIndexPath:にテキストを設定しました。そしてtableView:heightForRowAtIndexPath:よりも

UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
return cell.detailTextLabel.frame.size.height

長いひもがありました。最後に、ラベルに4行のテキストを含む幅の広いセルを作成しました。

0
DanSkeel