web-dev-qa-db-ja.com

uitableviewcellのテキストラベルが長すぎてdetailtextlabelを非表示にプッシュ

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;
}

そのため、私の通貨名は一部のエントリで長いものになります。

29
lucas

私にとって最も簡単なのは、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の適用に失敗しました

6
c0ming

同じ問題が発生し、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

これを行うと、すべて設定されているはずです。幸運を!

3
Flaviu

UITableViewで「RightDetail」を使用しようとしたときに、同様の問題が発生しました。右の詳細に組み込まれているタイトルラベルは、私の字幕ラベルを覆い隠していた。

最終的に、私は自分のカスタムのものを支持して「右の詳細」をあきらめました(Swiftと自動レイアウトを使用):

  1. UITableViewCellから継承した独自の単純なクラスを作成しました。

    class TransactionCell: UITableViewCell
    {
    
    }
    
  2. 「テーブルビューセル」メニューの「スタイル」フィールドを「カスタム」に設定し、「カスタムクラス」メニューの「クラス」フィールドに「TransactionCell」を追加して、プロトタイプセルにそのカスタムクラスを使用するように設定しました。これらのメニューは、ストーリーボードでプロトタイプセルを選択すると使用できます。 enter image description hereenter image description here

  3. プロトタイプセルに2つのラベルを追加し、ラベルからクラスに右クリックしてドラッグしてカスタムクラスに接続しました(奇妙なことに、これを実行する前にビルドをクリーンアップする必要がありました)。

    class TransactionCell: UITableViewCell{
    
        @IBOutlet weak var detailsLabel: UILabel!
    
        @IBOutlet weak var amountLabel: UILabel!
    
    }
    
  4. Swiftの自動レイアウト機能を利用して、ラベルに新しい制約を追加しました(独自の要件に一致するようにこれらを設定する必要があります。行き詰まった場合は、自動レイアウトのチュートリアルを参照してください)

How to add new constraints: click on the thing to add constraints to then click on this symbol

  1. ...そして、それぞれの[ラベル]メニューの[行]フィールドと[改行]フィールドを設定して、ラベル間の間隔が均等になるようにし、詳細ラベルが複数行に曲がるようにします。 enter image description here

それは私にとってはうまくいき、UITableViewの複数行の異なる量をセルごとにSwiftで、Wordの折り返しをフォーマットして見栄えが良くなるようにフォーマットすることができました。 「RightDetail」が自動的に実行されることを期待しています。

2
Robert Hyatt

ビューのフレームを調整します:textLabel

 CGRect aFrame = cell.textLabel.frame;
 aFrame.size.width = 100;  // for example
 cell.textLabel.frame = aFrame;
1
Rayfleck

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        
        }
    }
}
1
Dmytro Shvetsov

できます!!しかし、私はクリストファーキングのコードを変更しました:

- (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;
0

最新の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
    }
}
0
Richard Topchiy

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;
0
RemembranceNN

必要に応じて制御できる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;
}

おそらく「最適化」されていませんが、単純なシナリオでは機能します。

0

私はこれに苦労し、非常に簡単な答えを見つけました。私のtextLabelは左側にあり、右側のdetailTextを、時々まったく見えないところまで押し出していました。

私の解決策は、Table View CellstyleLeft 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()
0
Craig.Pearce