2010-04-17 6 views

Odpowiedz

23

Nie jestem w 100% pewny, że zadziała to w przypadku nagłówka tabeli, ale działa on w przypadku wierszy tabeli, więc warto spróbować. Mam instancja zmiennej headerHeight początkowo ustawiona na 44,0 i zmienić go jako tak:

- (void)changeHeight { 
    [self.tableView beginUpdates]; 
    headerHeight = 88.0; 
    [self.tableView endUpdates]; 
} 

W moim kodu mam zwrócić headerHeight w heightForRowAtIndexPath ale można spróbować go heightForHeaderInSection:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    return headerHeight; 
} 
+0

dzięki @ prendio2 że działa dobrze. nie udało się jednak usunąć widoku (co właśnie próbowałem zrobić). ale jak tylko przewinąłem to zostało usunięte, więc to jest ok :) – jasongregori

+1

dla każdego, kto ma ten sam przypadek użycia co ja (chcą usunąć widok), możesz zachować odnośnik do niego i użyć metody "removeFromSuperview" na to podczas animacji, aby ukryć to poprawnie. – jasongregori

+3

To działa dobrze, ale obszar, który pojawia się, obejmuje moją pierwszą UITableViewCell. Jakieś pomysły? Jakikolwiek sposób, aby przesunąć tableView w dół, kiedy to się dzieje? – arooo

-1

nie testowałem, ale czasami mam niepotrzebne animacje kiedy moi UITableViewCells zmienić wysokość. Przyczyną tego jest to, że rysuję własne komórki, a ja używam CALayerów, aby to zrobić. W komórki (void)layoutSubviews chciałbym zmienić rozmiar mojej CALayer być wielkość ramy dla komórki

myLayer.frame = self.bounds; 

Gdy właściwość Rama/granice zmienia CALayer, jest animowana. Więc teoretycznie powiedziałbym, że możesz użyć metody tableView: viewForHeaderInSection: która pozwoli ci narysować własny nagłówek sekcji. może po prostu wrócić do UIView, który implementuje (void)layoutSubviews a następnie w tej metodzie zrobić

self.layer.frame = self.bounds; 

tylko pomysł.

11

to działa :

flatHeader = YES; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.3]; 
[[self tableView] beginUpdates]; 
[[self tableView] endUpdates]; 
CGRect frame = [[self headerView] frame]; 
frame.size.height = [self tableView:[self tableView] heightForHeaderInSection:0]; 
[[self headerView] setFrame:frame]; 
[UIView commitAnimations]; 
2

Moje rozwiązanie w Swift:

class MyTableViewController: UITableViewController { 

var sectionHeaderView:UIView? 

...

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    sectionHeaderView = UIView(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30)) 
    sectionHeaderView?.backgroundColor = UIColor.grayColor() 

    var button = UIButton(frame: CGRectMake(0, 0, self.tableView.frame.size.width, 30)) 
    button.backgroundColor = UIColor.darkGrayColor() 
    button.setTitle("collapse/expand", forState: .Normal) 
    button.addTarget(self, action: "collapseOrExpandSectionHeader", forControlEvents: .TouchUpInside) 

    sectionHeaderView?.addSubview(button) 

    return sectionHeaderView 
} 

...

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 

    if let sectionHeader = sectionHeaderView { 
     return view.frame.size.height 
    } else { 
     return 30.0 
    } 
} 

...

func collapseOrExpandSectionHeader() { 

    if let sectionHeader = sectionHeaderView { 

     let headerHeight:CGFloat 

     if sectionHeader.frame.size.height == 200 { 
      headerHeight = 30.0 
     } else { 
      headerHeight = 200.0 
     } 

     UIView.animateWithDuration(0.3, animations: { 
      self.tableView?.beginUpdates() 
      sectionHeader.frame.size.height = headerHeight 
      self.tableView?.endUpdates() 
     }) 
    } 
}