8

セルのseeMoreBtnをクリックした後、セルサイズを拡大したい。

ラベルとセルの長さはさまざまですが、ラベルのサイズに制約があります。

ステータスが大きすぎる場合は、seeMoreBtnを追加しました。[詳細]をクリックすると、残りのテキストが下に表示され、ラベルとセルサイズを大きくする方法が表示されます。

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


        NSString *text = [items objectAtIndex:[indexPath row]];
        CGSize constraint = CGSizeMake(300.0f, 150.0f);
        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:constraint lineBreakMode:NSLineBreakByCharWrapping];

        CGFloat height1 = MAX(size.height, 44.0f);
        return height1 + (40.0f);
        }
     - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *CellIdentifier = [NSString stringWithFormat:@"Cell-%d",indexPath.row];

        cell=[tv dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil)
        {
            cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }

        int lbltag = 1000;

        label=[[UILabel alloc]initWithFrame:CGRectZero];
        [label setLineBreakMode:NSLineBreakByWordWrapping];
        [label setMinimumScaleFactor:14.0f];
        [label setNumberOfLines:0];
        [label setFont:[UIFont systemFontOfSize:14.0f]];
        NSString *text = [items objectAtIndex:[indexPath row]];
        [label setText:text];
        label.tag = lbltag;
        [cell addSubview:label];

        CGSize constraint1=CGSizeMake(300.0f, 150.0f);
        CGSize size1=[text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:constraint1 lineBreakMode:NSLineBreakByWordWrapping];


        [label setFrame:CGRectMake(10.0f, 10.0f, 300.0f, MAX(size1.height, 44.0f))];

        int countText=text.length;

        if (countText>=350) {
            seeMoreBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
            [seeMoreBtn setTitle:@"See More" forState:UIControlStateNormal];
            seeMoreBtn.frame=CGRectMake(220.0f, MAX(size1.height, 44.0f)-10, 80.0f, 20.0f);
            seeMoreBtn.tag=indexPath.row ;
              [seeMoreBtn addTarget:self action:@selector(increaseSize:) forControlEvents:UIControlEventTouchUpInside];
            [cell addSubview:seeMoreBtn];            
        }
        return cell;
    }

    -(void)increaseSize:(UIButton *)sender{
//What to write here that can adjust the label and cell size

    }
4

3 に答える 3

5

UITableViewCellをサブクラス化し、layoutSubviewsを使用してセルのサイズを調整する場合は、より良いでしょう。

//In SMTableViewCell.h

@interface SMTableViewCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
@property (weak, nonatomic) IBOutlet UIButton *seeMoreButton;

//SMTableViewCell.m

- (void)layoutSubviews
{
    CGRect labelFrame = self.statusLabel.frame;
    labelFrame.size.height = self.frame.size.height - 55.0f;
    self.statusLabel.frame = labelFrame;

    CGRect buttonFrame = self.seeMoreButton.frame;
    buttonFrame.origin.y = labelFrame.origin.y+labelFrame.size.height+10.0f;
    self.seeMoreButton.frame = buttonFrame;
}

selectedIndexPathsを格納するための配列を保持します。

@property (nonatomic, strong) NSMutableArray *selectedIndexPaths;

セルの高さを計算します。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath];

    CGFloat maxHeight = MAXFLOAT;
    CGFloat minHeight = 40.0f;

    CGFloat constrainHeight = isSelected?maxHeight:minHeight;
    CGFloat constrainWidth  = tableView.frame.size.width - 20.0f;

    NSString *text       = self.items[indexPath.row];
    CGSize constrainSize = CGSizeMake(constrainWidth, constrainHeight);
    CGSize labelSize     = [text sizeWithFont:[UIFont systemFontOfSize:15.0f]
                            constrainedToSize:constrainSize
                                lineBreakMode:NSLineBreakByCharWrapping];

    return MAX(labelSize.height+75, 100.0f);

}

カスタムの初期化より多くのTableViewCellを表示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CellIdentifier";

    SMTableViewCell *cell= (SMTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        cell = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([SMTableViewCell class])
                                             owner:nil
                                           options:nil] lastObject];
    }

    BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath];
    cell.statusLabel.numberOfLines = isSelected?0:2;

    NSString *text = self.items[indexPath.row];
    cell.statusLabel.text = text;


    NSString *buttonTitle = isSelected?@"See Less":@"See More";
    [cell.seeMoreButton setTitle:buttonTitle forState:UIControlStateNormal];
    [cell.seeMoreButton addTarget:self action:@selector(seeMoreButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [cell.seeMoreButton setTag:indexPath.row];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

ボタンクリックイベントメソッド:

- (void)seeMoreButtonPressed:(UIButton *)button
{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
    [self addOrRemoveSelectedIndexPath:indexPath];
}

- (void)addOrRemoveSelectedIndexPath:(NSIndexPath *)indexPath
{
    if (!self.selectedIndexPaths) {
        self.selectedIndexPaths = [NSMutableArray new];
    }

    BOOL containsIndexPath = [self.selectedIndexPaths containsObject:indexPath];

    if (containsIndexPath) {
        [self.selectedIndexPaths removeObject:indexPath];
    }else{
        [self.selectedIndexPaths addObject:indexPath];
    }

    [self.tableView reloadRowsAtIndexPaths:@[indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];

}

セルが選択されている場合、同じイベントが発生します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [self addOrRemoveSelectedIndexPath:indexPath];

}

サンプルデモプロジェクトのリンク。

于 2013-03-23T12:18:33.757 に答える
1

次のようなプロパティを追加します。

@property(strong, nonatomic) NSArray *enlargedIndexPaths;

空の配列に初期化します。テーブルビューデリゲートを実装します。

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

    return ([self.enlargedIndexPaths containsObject:indexPath])? 88.0 : 44.0;
}

次にincreaseSizeで:

UITableViewCell *cell = sender.superview;
NSIndexPath *indexPath = [self.tableView indexPathFoCell:cell];
[self.enlargedIndexPaths addObject:indexPath];

// do you want to enlarge more than one at a time?  You can remove index paths 
// here, too.  Just reload them below
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:self.enlargedIndexPaths] withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];
于 2013-03-23T12:06:09.440 に答える
0

アイデアは、セルに設定した値に基づいて、セルの高さを変更することです。NSArrayを使用して、すべてのセルに値isExpanded(trueまたはfalse)をマークすることができます。

要約すると、セルの状態(展開されているかどうかに関係なく)を格納するNSMutableArrayを作成します。

NSMutableArray *cellState;

配列を初期化し、すべてのUITableViewアイテムの配列をゼロで埋めます。セルが展開されたら、cellState objectAtIndex値を0から1に設定します(展開済みとしてマークします)。

次に、そのセルをリロードします。

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationFade];

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;セルが展開された場合に大きな値を返すように関数を変更します。

それでおしまい!

于 2013-03-23T12:04:08.980 に答える