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:メソッドの問題について新しい質問をしました 。
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];
NSStringの-sizeWithFont:forWidth:lineBreakMode:
メソッドを使用して、ラベルの関連するサイジングメトリックを取得する必要があります。
また、そのコードを使用する場合は、numberOfLines
プロパティを0
に変更します。
NSString
の-sizeWithFont:forWidth:lineBreakMode:
は、実際にはワードラップを実行しません。代わりに、-sizeWithFont:constrainedToSize:lineBreakMode:
文字列の正確な幅と高さの値を取得します。
これを試して:
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];
また、UITableViewDelegateメソッドを実装する必要があります。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
そして、サイズ変更されたテキストフィールドに合わせて調整された合計セルの高さを返します。
もう1つの注意点-前述のように行数が0に設定されている場合、実際にフィットするサイズが実際に機能するはずです。ラベルに設定されたWordでラップされたテキストに合わせて高さを増やし、元のラベルの幅に合わせて幅を設定したサイズを戻します。
ただし、セルを取得する前にheightForRowのサイズを取得する必要があるため、これは役に立ちません。したがって、必要な高さを計算することをお勧めします。
ここに私が使用するコードのビットがあります:
CGSize textSize = [myLabel.text sizeWithFont:myLabel.font];
同様の問題がありました。これを解決しました。
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;
同様の問題があり、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行のテキストを含む幅の広いセルを作成しました。