UITableViewCellStyleValue1を使用していると、textLabelの長い文字列が表示され、どういうわけかdetailTextLabelがビューからプッシュアウトされました。
TextLabelテキストをショートすると、detailTextLabelのテキストが表示されます。
上記のスタイルでtextLabelの幅を制限して、textLabelが長すぎると切り捨てられるようにする方法はありますか?
私のコードは:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
//---get the letter in each section; e.g., A, B, C, etc.---
NSString *alphabet = [self.currencyNameIndex objectAtIndex:[indexPath section]];
//---get all states beginning with the letter---
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
self.currencyList = [self.keyCurrencyName filteredArrayUsingPredicate:predicate];
if ([self.currencyList count] > 0)
{
NSString *currencyName = [self.keyCurrencyName objectAtIndex:indexPath.row];
cell.textLabel.text = currencyName;
NSString *currencyCode = [self.valueCurrencyCode objectAtIndex:indexPath.row];
cell.detailTextLabel.text = currencyCode;
}
return cell;
}
そのため、私の通貨名は一部のエントリで長いものになります。
私にとって最も簡単なのは、UITableViewCellをサブクラス化し、layoutSubviewsをオーバーライドすることでした。
ラベルフレームだけから位置を計算する信頼できる方法が見つからなかったため、この場合はUITableViewCellAccessoryDisclosureIndicatorアクセサリタイプのUITableViewCellStyleValue1セルのアクセサリ幅をハードコーディングしました。
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat detailTextLabelWidth = [self.detailTextLabel.text sizeWithFont:self.detailTextLabel.font].width;
CGRect detailTextLabelFrame = self.detailTextLabel.frame;
if (detailTextLabelFrame.size.width <= detailTextLabelWidth && detailTextLabelWidth > 0) {
detailTextLabelFrame.size.width = detailTextLabelWidth;
CGFloat accessoryWidth = (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) ? 28.0f : 35.0f;
detailTextLabelFrame.Origin.x = self.frame.size.width - accessoryWidth - detailTextLabelWidth;
self.detailTextLabel.frame = detailTextLabelFrame;
CGRect textLabelFrame = self.textLabel.frame;
textLabelFrame.size.width = detailTextLabelFrame.Origin.x - textLabelFrame.Origin.x;
self.textLabel.frame = textLabelFrame;
}
}
@Jhaliya @lucas
cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;
ここを参照してください: カスタムUITableViewCell。UILineBreakModeTailTruncationの適用に失敗しました
同じ問題が発生し、UITableViewCellサブクラスを作成する必要がありました。思ったより簡単です。
基本的には、UITableViewCellのサブクラスである新しいファイルを作成するだけです。
ラベルを追加して合成します。
// in the .h file
@property (nonatomic, weak) IBOutlet UILabel *textLabel;
@property (nonatomic, weak) IBOutlet UILabel *detailTextLabel;
// in the .m file
@synthesize textLabel, detailTextLabel;
StoryBoardで、クラスをセルのクラスとして設定し、スタイルを「カスタム」にして、セルに2つのラベルを追加して、希望どおりに表示します(デフォルトと同じように表示します: http:// cl.ly/J7z )
最も重要な部分は、ラベルをセルに接続していることを確認することです
セルからドキュメントアウトラインのラベルまでControlキーを押しながらクリックする必要があります。これがどのように見えるかの写真です: http://cl.ly/J7BP
カスタムセル、動的セル、静的セルを作成する方法を理解するのに役立ったのは、このYouTubeビデオです: http://www.youtube.com/watch?v=fnzkcV_XUw8
これを行うと、すべて設定されているはずです。幸運を!
UITableViewで「RightDetail」を使用しようとしたときに、同様の問題が発生しました。右の詳細に組み込まれているタイトルラベルは、私の字幕ラベルを覆い隠していた。
最終的に、私は自分のカスタムのものを支持して「右の詳細」をあきらめました(Swiftと自動レイアウトを使用):
UITableViewCellから継承した独自の単純なクラスを作成しました。
class TransactionCell: UITableViewCell
{
}
「テーブルビューセル」メニューの「スタイル」フィールドを「カスタム」に設定し、「カスタムクラス」メニューの「クラス」フィールドに「TransactionCell」を追加して、プロトタイプセルにそのカスタムクラスを使用するように設定しました。これらのメニューは、ストーリーボードでプロトタイプセルを選択すると使用できます。
プロトタイプセルに2つのラベルを追加し、ラベルからクラスに右クリックしてドラッグしてカスタムクラスに接続しました(奇妙なことに、これを実行する前にビルドをクリーンアップする必要がありました)。
class TransactionCell: UITableViewCell{
@IBOutlet weak var detailsLabel: UILabel!
@IBOutlet weak var amountLabel: UILabel!
}
Swiftの自動レイアウト機能を利用して、ラベルに新しい制約を追加しました(独自の要件に一致するようにこれらを設定する必要があります。行き詰まった場合は、自動レイアウトのチュートリアルを参照してください)
それは私にとってはうまくいき、UITableViewの複数行の異なる量をセルごとにSwiftで、Wordの折り返しをフォーマットして見栄えが良くなるようにフォーマットすることができました。 「RightDetail」が自動的に実行されることを期待しています。
ビューのフレームを調整します:textLabel
CGRect aFrame = cell.textLabel.frame;
aFrame.size.width = 100; // for example
cell.textLabel.frame = aFrame;
GosoftworksDevelopmentの回答を更新しました。
スウィフト3
class BaseTableViewCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
guard let tl = textLabel, let dl = detailTextLabel else { return }
if (tl.frame.maxX > dl.frame.minX) {
tl.frame.size.width = dl.frame.minX - tl.frame.minX - 5
}
}
}
できます!!しかし、私はクリストファーキングのコードを変更しました:
- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font :(NSString*) result
{
while ([result sizeWithFont:font].width > width)
{
result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];
result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
}
return result;
}
および使用法:
NSString* text = @"bla bla bla some long text bla bla";
text = [self stringByTruncatingToWidth:cell.frame.size.width-70.0 withFont:[UIFont systemFontOfSize:17] :text];
cell.textLabel.text = text;
最新のiOSをサポートするSwiftバージョン(12):
override func layoutSubviews() {
super.layoutSubviews()
guard let detailWidth = detailTextLabel?.intrinsicContentSize.width, var detailFrame = detailTextLabel?.frame else {
return
}
let padding = layoutMargins.right
if (detailFrame.size.width <= detailWidth) && (detailWidth > 0) {
detailFrame.size.width = detailWidth
detailFrame.Origin.x = frame.size.width - detailWidth - padding
detailTextLabel?.frame = detailFrame
var textLabelFrame = textLabel!.frame
textLabelFrame.size.width = detailFrame.Origin.x - textLabelFrame.Origin.x - padding
textLabel?.frame = textLabelFrame
}
}
1番目:改行モードを設定します
textLabel.lineBreakMode = NSLineBreakByTruncatingTail;
2番目:必要なtexLabelフレーム幅を設定します(例:200)
CGRect textFrame = self.textLabel.frame;
CGRect newTextFrame = CGRectMake(textFrame.Origin.x, textFrame.Origin.y, 200, textFrame.size.height);
self.textLabel.frame = newTextFrame;
必要に応じて制御できるUILabelを含むカスタムUITableViewCellを作成するか、基本クラスのtextLabelに割り当てたテキストを切り捨ててスペースに合わせます。
完璧ではありませんが、次のような方法でNSStringカテゴリを使用して、カスタムセルが過剰な場所(たとえば、唯一の問題がテキストの挿入であった場合)でテキスト切り捨て手法を使用しました。
- (NSString *)stringByTruncatingToWidth:(CGFloat)width withFont:(UIFont *)font
{
NSString *result = [NSString stringWithString:self];
while ([result sizeWithFont:font].width > width)
{
result = [result stringByReplacingOccurrencesOfString:@"..." withString:[NSString string]];
result = [[result substringToIndex:([result length] - 1)] stringByAppendingString:@"..."];
}
return result;
}
おそらく「最適化」されていませんが、単純なシナリオでは機能します。
私はこれに苦労し、非常に簡単な答えを見つけました。私のtextLabel
は左側にあり、右側のdetailText
を、時々まったく見えないところまで押し出していました。
私の解決策は、Table View Cell
style
をLeft Detail
またはRight Detail
からSubtitle
に変更することです。このソリューションは、detailText
が右または左ではなく下にあることを気にしない場合に機能します。
行の高さに問題がある場合は、以下のviewDidLoad
のコードを使用して調整できます。
self.tableView.estimatedRowHeight = 500 // set this as high as you might need, although I haven't tested alternatives
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.reloadData()