2

UITableViewタイトル、本文、作成者、日付の4 つがありUILabel'sます。彼は次のように見えます。

cell55

私が達成したいのは、ユーザーがセル自体をクリックすると、別のラベルがセルに追加され、「本文」ラベルが追加され、セルはこのラベルのサイズに従って拡大されることです。

このようなもの:

セルサイズ

どうやってやるの?stackoverflow を検索し、いくつかのコードを試しましたが、適切な解決策が見つかりませんでした。

ありがとう!

編集 1: 14.11.12 14:52

現在のテキストで UILabel のサイズを変更することができました:

- (CGRect )resizeLabelByFontSize:(UILabel *)customCellLabel withMaxHeightSize:(CGFloat )maxHeight
{
    CGSize maximumLabelSize = CGSizeMake(239, maxHeight);

    CGSize expectedLabelSize = [customCellLabel.text sizeWithFont:customCellLabel.font constrainedToSize:maximumLabelSize lineBreakMode:customCellLabel.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = customCellLabel.frame;
    newFrame.size.height = expectedLabelSize.height;

    return newFrame;
}

しかし、新しい UILabel のサイズに応じてセルのサイズを変更するにはどうすればよいですか?

4

6 に答える 6

1

問題の画像を見ることで

これは、動的フレームを作成する方法です。これをUILabel見てください。高さと幅を取得するUIlabelことで、全体の高さを計算し、行の高さを設定できます。UITableView.

- (void)setLabeltextWithVerticalAlignTop:(NSString *)theText
{
CGSize labelSize;
// here  labelSize is hard-wired but could use constants to populate the size

labelSize = CGSizeMake(210, 129);//this is just for example
//now create the Size from textString SO that We  could assign this size to the Label.

 CGSize theStringSize = [theText sizeWithFont:lblTitle.font  constrainedToSize:labelSize lineBreakMode:lblTitle.lineBreakMode];
 lblTitle.frame = CGRectMake(lblTitle.frame.origin.x, lblTitle.frame.origin.y, theStringSize.width, theStringSize.height);
 lblTitle.text = theText;

}

上記のメソッドの呼び出し 説明ラベルの高さと幅を設定するには、その説明ラベルに表示されるテキストを渡す必要があります。そのラベルの高さを取得すると、これに基づいてTableViewの行の高さを調整できます。

編集:上記のコードは、UILabel の動的フレームを作成するだけです

これはあなたが探しているものです....!!!.ここにサンプルコードもあります。

編集:質問を編集したので、ここにある実行可能なコードに変換する必要があるのはロジックだけです。

各行に対して呼び出されるコードで以下のメソッドを使用し、その中で計算を行います。

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat rowHeight=0.0;
//here it seems cell have 4 subview added on it.
//so if you could calculate the totla hieht of them.

//so what you really need to do.you just use hieght calculative Method for getting hieght of each of three UILabel
//you need to modify  `setLabeltextWithVerticalAlignTop` method .
rowHeight=   [self setLabeltextWithVerticalAlignTop:@"pass the correspondingText"];// suppose it returns some hieght for FisrtLabel.

//suppoose here you get the 20.0 height here

rowHeight= rowHeight+[self setLabeltextWithVerticalAlignTop:@"pass the correspondingText"];
 

// secondUIlabel の高さを返すとします。

//suppoose here you get the 40.0 height here

rowHeight=  rowHeight+ [self setLabeltextWithVerticalAlignTop:@"pass the correspondingText"];

 // suppose it returns some hieght for ThirdUIlabel.
// suppoose here you get the 15.0 height here
//here you have totla height you just need to add some gapping floating value for all of three UIlabel.so that the could not overlap like as.

 rowHeight= rowHeight+20.0;

  //now you can return that total height
  return rowHeight;
 }

注:これは、実行可能なコードに変換するために必要な単なるロジックです。これが役立つと確信しています。

お役に立てば幸いです。

于 2012-11-14T11:57:39.317 に答える
0

したがって、これを行うために、expended UITableViewCell を使用して、2 つの異なるカスタム セルを作成しました。開始時にテーブルに最初のセルが表示され、セルをクリックすると、テーブルに 2 番目のセルが表示されます。それはとても簡単です - はい!

したがって、テーブルデリゲートメソッドを実装する UITableView を持つ UIViewController があります。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    if([self.selectedCellIndexPath isEqual:indexPath])
    {
        return [self expandedCellHeight:indexPath];
    }
    else
    {
        return kRegularCellHeight;
    }
}

-(CGFloat)expandedCellHeight:(NSIndexPath *)indexPath
{
    CGSize maxSize = CGSizeMake(303, 200);
    NSString* bodyText  = [[self.data objectAtIndex:indexPath.row] objectForKey:kForumMessagesBody];
    CGSize fitSize = [bodyText sizeWithFont:[UIFont systemFontOfSize:13] constrainedToSize:maxSize lineBreakMode:UILineBreakModeWordWrap];

    CGFloat height = 384 - 69 + fitSize.height;
    NSLog(@"expandedHeight: %f",height);
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Answer cell
    if ([self.selectedCellIndexPath isEqual:indexPath])
    {
        cell = [tableView dequeueReusableCellWithIdentifier:[ForumCell expandedAnswerReuseIdentifier]];
        if (cell == nil)
        {
            cell = [ForumCell expandedAnswerCell];
        }
        self.expandedCell = cell;

    }
    else
    {
        cell = [tableView dequeueReusableCellWithIdentifier:[ForumCell reqularAnswerReuseIdentifier]];
        if (cell == nil)
        {
            cell = [ForumCell regularAnswerCell];
        }
    }

    cell.labelMedia.text = [self.data objectAtIndex:indexPath.row];

    return cell;
}

また、カスタム セルと呼ばれるクラスがForumCell.hありForumCell.m、2 つの異なる XIB ファイルがあります: ForumRegularAnswerCell.xiband ForumExpandedAnswerCell.xib、内部に次のコードがありますForumCell.h

+ (NSString*)reqularAnswerReuseIdentifier
{
    return @"RegularAnswerCellReuseIdentifier";
}

+ (NSString*)expandedAnswerReuseIdentifier
{
    return @"ExpandedAnswerCellReuseIdentifier";
}

+ (ForumCell*)regularAnswerCell
{
    NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"ForumRegularAnswerCell" owner:self options:nil];
    ForumCell* result = [objs objectAtIndex:0];

    return result;
}

+ (ForumCell*)expandedAnswerCell
{
    NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"ForumExpandedAnswerCell" owner:self options:nil];
    ForumCell* result = [objs objectAtIndex:0];

    return result;
}

- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super initWithCoder:decoder];
    if (self)
    {
        _originalCellHeight = self.frame.size.height;
        _originalLblBodyHeight = self.lblBody.frame.size.height;
    }
    return self;
}

必要に応じて、2 つ以上の xib を使用することもできます。しかし、これが基本です。

楽しみ!

于 2013-01-01T08:37:48.617 に答える
0

NSIndexPath *selectedRow;

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
selectedRow = indexPath;
}


 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
 if(indexPath == selectedRow){
    //return your custom value
}
return 100;

}

みたいな感じになると思います

于 2012-11-14T12:26:50.407 に答える
0

以下のメソッドを実装します

– (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    // cast cell, add label, expand labels etc

    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath isEqualTo:[tableView indexPathForSelectedRow]] ? /* expanded height */ : 80 /* normal height */;
}

別の行が選択された後でもその行が選択されたままになるようにする場合は、カスタム BOOL プロパティをカスタム セルに追加し、expandedそれを使用して高さを決定します。

于 2012-11-14T11:44:50.237 に答える
0

tableView:didSelectRowAtIndexPath を使用できます

そのメソッドでは、コードを作成して本文ラベルを再表示し、他のすべての相対位置を調整できます。行の新しい高さを計算してから、Table View の reloadRowsAtIndexPath: withRowAnimation: メソッドを呼び出します。

詳細があまりない場合は申し訳ありませんが、うまくいけば、正しい軌道に乗るはずです.

于 2012-11-14T11:45:24.367 に答える
0

わかりました、まず...展開するには、次のようなものが必要です:

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

ここにキャッチがあります:

  • UITableViewCell (展開されたものと展開されていないもの) のサイズを計算する必要があります。
  • 実際にスクロールしているときにそうすると、コストがかかり、悪い経験になる可能性があります

私のアドバイス:

  • UITableView動的なサイズが必要なため、実際に を構築する前に、両側を計算してください。そうしないと、すべてのセルが同じサイズで展開される場合は、ラマートが言ったことを使用できます。
于 2012-11-14T11:46:41.093 に答える