2014-10-31 50 views
2

在顯示detailedViewController之前,我想要像在下面的圖像中激活UITableViewCell單元格調整大小較小)。我從過去兩天開始嘗試,並嘗試了其他所有類似問題的答案。UITableViewCell當用戶觸地或點擊單元格時動畫調整大小

我希望單元格可以在用戶將手指放在UITableViewCell上時進行動畫/調整大小。

enter image description here

的UITableViewCell的是一個自定義單元格。我曾嘗試在UITableViewCell子類的setSelected:(BOOL)selected animated:(BOOL)animated方法中爲cell.contentView設置一個新框架。 UITableViewCell沒有按照我的預期調整大小。

我還觀察到的是,當用戶從UITableViewCell上擡起手指時,會調用此方法。實際上,我希望在用戶點擊單元格時發生這種情況。如果沒有選擇單元格並且用戶移動到其他單元格,單元格應該調整大小恢復到正常大小。

然後我做了一些搜索從UITableViewCell接收觸摸事件。我嘗試添加一個UILongPressGestureRecognizer and UITapGestureRecognizer,並在選擇我試圖改變cell.contentView幀像這樣

cell.contentView.frame = CGRectMake(cell.frame.origin.x +20, cell.frame.origin.y, cell.frame.size.width-20, cell.frame.size.height); 
[cell setNeedsDisplay]; 

但所選單元格只閃爍(單元格背景)它不調整如我所料。

任何建議將非常有幫助。在此先感謝

回答

1

好吧通過閱讀一些文檔和通過WWDC視頻的經歷,我能夠解決這個問題。

我已經學會了一件重要的事情。

不要在使用AutoLayoutEnabled的視圖上使用setFrame:

記住這一點,我將自定義UITableViewCell xib更改爲使用自動調整大小的蒙版。然後在我的UITableViewController中使用這些代碼tableView:didHighlightRowAtIndexPath:tableView:didUnHighlightRowAtIndexPath:代表

這裏是我的視圖控制器的代碼片段。

 -(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

     NSLog(@"I'm Highlighted at %ld",(long)indexPath.section); 
     CustomTableViewCell *cell = (CustomTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; 

     originalCellSize = cell.frame; 

//Using animation so the frame change transform will be smooth. 

     [UIView animateWithDuration:0.1f animations:^{ 

      cell.frame = CGRectMake(cell.frame.origin.x +20, cell.frame.origin.y, cell.frame.size.width-40, cell.frame.size.height); 
     }]; 

    } 


    -(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     CustomTableViewCell *cell = (CustomTableViewCell *)[self.tableableView cellForRowAtIndexPath:indexPath]; 


     [UIView animateWithDuration:0.1f animations:^{ 
      cell.frame = CGRectMake(0, originalCellSize.origin.y, self.view.bounds.size.width, 180) ; 
     }]; 

     originalCellSize = CGRectMake(0, 0, 0, 0); 
    } 
+1

感謝您張貼後續自己的問題。 – jpmartineau 2015-11-19 04:45:50

-1

試試這個

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath)path 
// or it must be some other method 
{ 
    [self.tableView beginUpdates]; 
    [[self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:rowAnimation]; 
    [self.tableView endUpdates]; 
} 

在您的表視圖委託方法你必須知道選擇哪個小區。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath)path 
{ 
    YourTableClass *cell=[tableView cellForRowAtIndexPath:path]; 
    if(cell.isTaped) 
    return increasedHeight; 
    else 
    return defaultHeight; 
} 
+0

didSelectRowAtIndexPath在用戶從屏幕上擡起手指時被調用。我甚至嘗試了willSelectRowAtIndexPath。它一收到水龍頭就不通知我。 – Priyatham51 2014-10-31 14:02:17

+2

在heightForRowAtIndexPath中調用cellForRowForAtIndexPath會使程序崩潰。 看到這個http://stackoverflow.com/a/12653203/1032179 – 2015-07-10 20:23:42

1

我試圖實現類似於你的東西。我試圖在UIImageView中顯示一部分UIImage,並將其添加到自定義UITableViewCell中,並設置了約束條件以使我的imageview具有整個單元的大小(與背景類似,特別是當您將自定義單元格作爲好)。我跟着@Joy已經爲this question提供答案,並創建了以下內容:

我將此添加到我的viewDidLoad

self.currentSelection = -1; 
// I changed his line below, so that the image resizing (cell resizing really) is constant for 
//all my images. I guess you can use this to resize your background back and forth to whatever size you want to. 
self.newCellHeight = self.tableView.frame.size.width*3/2; 

然後我說這些:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

//I added this to toggle a tap-tapagain kind of thing, so if the same cell is tapped twice, first tap expands and second tap collapses. 
    if (self.currentSelection==indexPath.row) { 
     self.currentSelection = -1; 
    }else{ 
     self.currentSelection = indexPath.row; 
    } 
     // save height for full text label 
// UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

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

} 
//The rest is pretty much the same as his code 
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // do things with your cell here 

    // sentinel 
    self.currentSelection = -1; 

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

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

最後一件事,如果你想顯示背景以居中,並從中心放大和縮小。我把我的ImageView內容模式居中,這樣的事情:

[cell.myImageView setContentMode:UIViewContentModeCenter]; 

我學到了很多@EmptyStack和@erkanyildiz答案this question

無論如何,我希望這有助於無論如何,並且抱歉,如果它們都不相關! :)

相關問題