我在iPhone應用程序中使用的是UITableView
,而且有一個屬於一組的人的列表。 我但願這樣,以便當用戶單擊特定的人(從而選擇單元格)時,單元格的高度會增長,以顯示多個用於編輯該人的屬性的UI控件。 動畫
這可能嗎? atom
我只是經過一點技巧解決了這個問題: 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
添加屬性以跟蹤所選單元格 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]; } }
我發現了一個很是簡單的解決方案,這是我正在研究的UITableView
的反作用。 博客
將像元高度存儲在一般經過tableView: heightForRowAtIndexPath:
來報告原始高度的變量中,而後在要對高度變化進行動畫處理時,只需更改變量的值並調用它便可。
[tableView beginUpdates]; [tableView endUpdates];
您會發現它不會徹底重載,但足以讓UITableView
知道它必須重繪單元格,獲取單元格的新高度值....猜猜是什麼? 爲您動畫化變化。 甜。
我在博客上有更詳細的解釋和完整的代碼示例。Animate UITableView單元格高度變化
我不知道有關連續調用beginUpdates / endUpdates的全部內容是什麼,您能夠只使用-[UITableView reloadRowsAtIndexPaths:withAnimation:]
。 這是一個示例項目 。
嘗試這樣作是爲了擴展按索引行
@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; }