2010-02-28 93 views
5

我無法動畫自定義UITableView部分標題。
目標是創建可摺疊的部分。
當我第一次點擊自定義標題時,它會按照預期動畫,但每次之後它都會在原始位置留下重複的內容併爲另一個創建動畫。UITableView自定義部分標題,重複問題

形象的例子:

alt text http://img35.imageshack.us/img35/4018/screenshot2010022722565.png alt text http://img291.imageshack.us/img291/8287/screenshot2010022723035.png
我的自定義頁眉:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
     UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease]; 
     customView.backgroundColor = [UIColor lightGrayColor]; 

     UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease]; 
      headerLabel.backgroundColor = [UIColor clearColor]; 
      headerLabel.opaque = NO; 
      headerLabel.textColor = [UIColor darkGrayColor]; 
      headerLabel.font = [UIFont boldSystemFontOfSize:16]; 
      headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0); 
      headerLabel.textAlignment = UITextAlignmentCenter; 
      NSDictionary *dictionary = [self.data objectAtIndex:section]; 
      headerLabel.text = [dictionary objectForKey:@"Title"]; 

      [customView addSubview:headerLabel]; 


      // add button to right corner of section 
     UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)]; 
      headerButton.center = CGPointMake(160.0, 22.0); 
      headerButton.backgroundColor = [UIColor clearColor]; 
      headerButton.tag = section; 
      [headerButton addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside]; 

      [customView addSubview:headerButton]; 

      return customView; 
} 

我的動畫方法:

- (void) expandSection:(id)sender { 

    if (expandedSection == [sender tag]) { 
     expandedSection = -1; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone]; 
    }else if (expandedSection == -1){ 
     expandedSection = [sender tag]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone]; 
    }else{ 
     [self.tableView beginUpdates]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone]; 
     expandedSection = [sender tag]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.tableView endUpdates]; 

    } 
    //[self.tableView reloadData]; 
} 

我並不很清楚怎麼回事,但實例表明我需要處理一些事情。我嘗試了一些東西,但我無法弄清楚。任何人在這方面的幫助將是偉大的!

編輯:我相信問題是reloadSections導致自定義視圖的實例。我無法釋放視圖,因爲我需要它作爲動畫更新的參考。任何想法,我可以做些什麼來解決這個問題?

回答

8

找到解決方案。

該表需要在每次更改之前重新加載。這樣,表格在進行任何更改之前處於最新狀態。

add [self.tableView reloadData]; 作爲「expandSection」方法中的第一個條目。

CODE:

- (void) expandSection:(id)sender { 

    [self.tableView reloadData]; 

    if (expandedSection == [sender tag]) { 
     expandedSection = -1; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone]; 
    }else if (expandedSection == -1){ 
     expandedSection = [sender tag]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone]; 
    }else{ 
     [self.tableView beginUpdates]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone]; 
     expandedSection = [sender tag]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.tableView endUpdates]; 

    } 
    //[self.tableView reloadData]; 
} 
+0

謝謝你修復了一個相關的問題,我想要產生一個刪除/插入相同行的動畫效果,在沒有首先調用'reloadData'的情況下,它只會動畫刪除,但不會動畫插入。這是非常奇怪的問題。 – Jeremy 2012-01-10 21:54:03

+0

好方法... + 1對你來說 – Sabby 2012-03-23 17:18:59

2

我具有通過使用動態高度細胞造成了類似的問題。我有一個可擴展的自定義標題視圖,當我更新tableView來插入和刪除該部分的相關行(意味着它們正在擴展,分別摺疊)時,UITableViewHeaderFooterView子類的部分標題未被回收。所以基本上分配了一個新的,並添加了舊的,導致重疊的意見。小區標識符已正確設置,因此一定是別的。當我刪除tableView.sectionHeaderHeight = UITableViewAutomaticDimension並實施func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat時,該視圖得到了適當的回收,每個部分只顯示一個標題視圖。

,我變成了實際工作中的另一個解決方案是使用UITableViewCell,而不是UITableViewHeaderFooterView,當你在func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?回到你剛纔return cell.contenView,這將工作,因爲該方法需要返回一個UIView和自定義UITableViewCell的contentView是UIView工作得很好。背後的想法是通過UITableViewCell使用UITableView的回收機制,並在配置後返回其內容。

結論:使用UITableViewHeaderFooterView與自定義tableView單元格和UITableViewAutomaticDimension而非手動計算單元格高度一起使用時,很可能導致此問題。

+0

有趣的事情,我已經使用UITableViewCells的標題,而不是使用自我大小的單元格,仍然有問題在這裏:) – Gobe 2017-09-30 23:41:18