選中後,能夠在UITableViewCell上設置高度變化的動畫嗎?

我在iPhone應用程序中使用的是UITableView ,而且有一個屬於一組的人的列表。 我但願這樣,以便當用戶單擊特定的人(從而選擇單元格)時,單元格的高度會增長,以顯示多個用於編輯該人的屬性的UI控件。 動畫

這可能嗎? atom


#1樓

我只是經過一點技巧解決了這個問題: spa

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值爲止:-) code


#2樓

添加屬性以跟蹤所選單元格 orm

@property (nonatomic) int currentSelection;

將其設置爲(例如) viewDidLoad的哨兵值,以確保UITableView從「正常」位置開始 索引

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //sentinel
    self.currentSelection = -1;
}

heightForRowAtIndexPath ,能夠設置選定單元格所需的高度 ip

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    int rowHeight;
    if ([indexPath row] == self.currentSelection) {
        rowHeight = self.newCellHeight;
    } else rowHeight = 57.0f;
    return rowHeight;
}

didSelectRowAtIndexPath ,保存當前選擇並保存動態高度(若是須要) get

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        // do things with your cell here

        // set selection
        self.currentSelection = indexPath.row;
        // save height for full text label
        self.newCellHeight = cell.titleLbl.frame.size.height + cell.descriptionLbl.frame.size.height + 10;

        // animate
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}

didDeselectRowAtIndexPath將選擇索引設置回前哨值,並將單元設置爲動畫形式 animation

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {       
        // do things with your cell here

        // sentinel
        self.currentSelection = -1;

        // animate
        [tableView beginUpdates];
        [tableView endUpdates];
    }
}

#3樓

我發現了一個很是簡單的解決方案,這是我正在研究的UITableView的反作用。 博客

將像元高度存儲在一般經過tableView: heightForRowAtIndexPath:來報告原始高度的變量中,而後在要對高度變化進行動畫處理時,只需更改變量的值並調用它便可。

[tableView beginUpdates];
[tableView endUpdates];

您會發現它不會徹底重載,但足以讓UITableView知道它必須重繪單元格,獲取單元格的新高度值....猜猜是什麼? 爲您動畫化變化。 甜。

我在博客上有更詳細的解釋和完整的代碼示例。Animate UITableView單元格高度變化


#4樓

我不知道有關連續調用beginUpdates / endUpdates的全部內容是什麼,您能夠只使用-[UITableView reloadRowsAtIndexPaths:withAnimation:]這是一個示例項目


#5樓

嘗試這樣作是爲了擴展按索引行

@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;
}
相關文章
相關標籤/搜索