31

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

だから私の通貨名はいくつかのエントリで長いものになります。

4

12 に答える 12

16

私にとって最も簡単なのは、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;
    }
}
于 2013-09-09T20:43:07.887 に答える
8

@ジャリヤ@ルーカス

cell.textLabel.numberOfLines = 3; // set the numberOfLines
cell.textLabel.lineBreakMode = UILineBreakModeTailTruncation;

ここを参照してください:カスタム UITableViewCell. UILineBreakModeTailTruncation の適用に失敗しました

于 2011-05-25T09:35:16.727 に答える
4

UITableView で「Right Detail」を使用しようとすると、同様の問題が発生しました。適切な詳細のビルトイン タイトル ラベルが字幕ラベルを上書きしていました。

最終的に、私は「正しいディテール」をあきらめて、独自のカスタム ディテールを支持しました (swift と autolayout を使用):

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

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

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

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

新しい制約を追加する方法: 制約を追加するものをクリックしてから、この記号をクリックします

  1. ...そして、それぞれの「ラベル」メニューで「行」フィールドと「改行」フィールドを設定して、ラベル間の間隔が均等になり、詳細ラベルが複数行に変更できるようにします。 ここに画像の説明を入力

それは私にとってはうまくいき、セルごとに迅速に UITableView のさまざまな量の複数行の柔軟性を持たせることができ、ワードラッピングをフォーマットして見栄えが良く、「正しい詳細」が期待していたようにさえすることができました自動的。

于 2015-12-31T18:57:13.360 に答える
3

同じ問題があり、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/ J7z3 )

最も重要な部分は、ラベルをセルに接続していることを確認することです

セルからドキュメント アウトラインのラベルまで、コントロール クリックする必要があります。これがどのように見えるかの写真です:http://cl.ly/J7BP

カスタム セル、動的セル、および静的セルの作成方法を理解するのに役立ったのは、次の YouTube ビデオです: http://www.youtube.com/watch?v=fnzkcV_XUw8

それができたら、準備は整っているはずです。幸運を!

于 2012-08-30T15:00:32.950 に答える
1

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

 CGRect aFrame = cell.textLabel.frame;
 aFrame.size.width = 100;  // for example
 cell.textLabel.frame = aFrame;
于 2011-04-21T15:20:32.273 に答える
0

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

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

于 2013-01-30T16:47:51.137 に答える
0

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;
于 2014-03-14T05:53:36.897 に答える
-7

UILabellineBreakModeプロパティを使用して、テキストを幅内に制限します。UILabel

@property(nonatomic) UILineBreakMode lineBreakMode

以下のように使用してください。

myLabel.lineBreakMode = UILineBreakModeTailTruncation;

で使用できる値のリストを次に示します lineBreakMode

http://developer.apple.com/library/ios/#documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html#//apple_ref/doc/c_ref/UILineBreakMode

編集:

UILabel要件に応じて幅を設定します

例えば。

myLabel.frame.size.width = 320;
于 2011-04-21T15:17:23.730 に答える