402

私はUITableViewiPhone アプリで を使用しており、グループに属している人のリストを持っています。ユーザーが特定の人をクリックすると (セルを選択すると)、セルの高さが大きくなり、その人のプロパティを編集するためのいくつかの UI コントロールが表示されるようにしたいと思います。

これは可能ですか?

4

21 に答える 21

887

UITableView私が取り組んでいたことへの副作用として、これに対する本当に簡単な解決策を見つけました.....

通常は を介し​​て元の高さを報告する変数にセルの高さtableView: heightForRowAtIndexPath:を保存し、高さの変化をアニメーション化する場合は、変数の値を変更してこれを呼び出します...

[tableView beginUpdates];
[tableView endUpdates];

完全なリロードは行わないことがわかりますがUITableView、セルを再描画し、セルの新しい高さの値を取得する必要があることを知るには十分です....そして何を推測しますか? それはあなたのために変化をアニメーション化します。甘い。

私のブログには、より詳細な説明と完全なコード サンプルがあります... Animate UITableView Cell Height Change

于 2010-01-14T11:42:26.963 に答える
64

サイモン・リーの答えが好きです。実際にその方法を試したことはありませんが、リスト内のすべてのセルのサイズが変更されるようです。タップされているセルだけを変更したいと思っていました。私はサイモンのようにそれをやったが、ほんの少しの違いがある. これにより、セルが選択されたときにセルの外観が変わります。そして、それはアニメーション化します。それを行う別の方法です。

現在選択されているセル インデックスの値を保持する int を作成します。

int currentSelection;

それで:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    int row = [indexPath row];
    selectedNumber = row;
    [tableView beginUpdates];
    [tableView endUpdates];
}

それで:

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

    if ([indexPath row] == currentSelection) {
        return  80;
    }
    else return 40;


}

tableView:cellForRowAtIndexPath: で同様の変更を加えて、セルのタイプを変更したり、セルの xib ファイルをロードしたりできると確信しています。

Like this, the currentSelection will start at 0. リストの最初のセル (インデックス 0) がデフォルトで選択されているように見せたくない場合は、調整を行う必要があります。

于 2011-04-25T23:25:51.510 に答える
11

beginUpdates/endUpdates を連続して呼び出すことに関するこのすべてが何であるかはわかりません-[UITableView reloadRowsAtIndexPaths:withAnimation:]これがプロジェクトの例です

于 2014-08-02T22:52:00.997 に答える
10

で解決しましreloadRowsAtIndexPathsた。

didSelectRowAtIndexPath選択したセルの indexPathに保存しreloadRowsAtIndexPaths、最後に呼び出します (リロードする要素のリストに対して NSMutableArray を送信できます)。

indexPathheightForRowAtIndexPathがexpandIndexPathセルのリストにあるかどうかを確認し、高さを送信できます。

この基本的な例を確認できます: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam これは簡単な解決策です。

助けがあれば、一種のコードを追加します

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath*)indexPath
{
    if ([indexPath isEqual:_expandIndexPath])
        return 80;

    return 40;
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    [cell.textLabel setText:@"wopwop"];

    return cell;
}

#pragma mark -
#pragma mark Tableview Delegate Methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSMutableArray *modifiedRows = [NSMutableArray array];
    // Deselect cell
    [tableView deselectRowAtIndexPath:indexPath animated:TRUE];
    _expandIndexPath = indexPath;
    [modifiedRows addObject:indexPath];

    // This will animate updating the row sizes
    [tableView reloadRowsAtIndexPaths:modifiedRows withRowAnimation:UITableViewRowAnimationAutomatic];
}
于 2014-11-14T13:20:05.123 に答える
3

これは、インデックスごとに行を拡張するためのものです。

@property (nonatomic) NSIndexPath *expandIndexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
{
if ([indexPath isEqual:self.expandedIndexPath])
    return 100;

return 44;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSMutableArray *modifiedRows = [NSMutableArray array];
if ([indexPath isEqual:self.expandIndexPath]) {
    [modifiedRows addObject:self.expandIndexPath];
    self.expandIndexPath = nil;
} else {
    if (self.expandedIndexPath)
        [modifiedRows addObject:self.expandIndexPath];

    self.expandIndexPath = indexPath;
    [modifiedRows addObject:indexPath];
}

// This will animate updating the row sizes
[tableView reloadRowsAtIndexPaths:modifiedRows withRowAnimation:UITableViewRowAnimationAutomatic];

// Preserve the deselection animation (if desired)
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ViewControllerCellReuseIdentifier];
    cell.textLabel.text = [NSString stringWithFormat:@"I'm cell %ld:%ld", (long)indexPath.section, (long)indexPath.row];

return cell;
}
于 2014-09-24T05:41:11.287 に答える
0

私は@Joyのすばらしい答えを使用しました.ios 8.4とXCode 7.1.1で完全に機能しました。

セルをトグル可能にする場合に備えて、 -tableViewDidSelect を次のように変更しました。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//This is the bit I changed, so that if tapped once on the cell, 
//cell is expanded. If tapped again on the same cell, 
//cell is collapsed. 
    if (self.currentSelection==indexPath.row) {
        self.currentSelection = -1;
    }else{
        self.currentSelection = indexPath.row;
    }
        // animate
        [tableView beginUpdates];
        [tableView endUpdates];

}

これがあなたのお役に立てば幸いです。

于 2015-11-19T21:00:56.900 に答える
0

入力 -

tableView.beginUpdates() tableView.endUpdates() これらの関数は呼び出されません

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}

ただし、そうする場合は、 tableView.reloadRows(at: [selectedIndexPath! as IndexPath], with: .none)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} この関数を呼び出し ます。

于 2018-03-28T11:08:58.123 に答える
-1

ちょっとしたハックでこの問題を解決しました:

static int s_CellHeight = 30;
static int s_CellHeightEditing = 60;

- (void)onTimer {
    cellHeight++;
    [tableView reloadData];
    if (cellHeight < s_CellHeightEditing)
        heightAnimationTimer = [[NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(onTimer) userInfo:nil repeats:NO] retain];
}

- (CGFloat)tableView:(UITableView *)_tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
        if (isInEdit) {
            return cellHeight;
        }
        cellHeight = s_CellHeight;
        return s_CellHeight;
}

セルの高さを拡張する必要がある場合は、設定isInEdit = YESしてメソッドを呼び出し[self onTimer]、s_CellHeightEditing 値に達するまでセルの成長をアニメーション化します :-)

于 2009-08-20T20:18:59.380 に答える
-2

選択した行のインデックスパスを取得します。テーブルをリロードします。UITableViewDelegate の heightForRowAtIndexPath メソッドで、選択した行の高さを別の高さに設定し、その他の行は通常の行の高さを返します

于 2009-01-21T15:13:54.297 に答える