2015-01-09 11 views
5

Sto utilizzando il metodo delegato viewForHeaderInSection per fornire un'intestazione di sezione nel mio UITableView.viewForHeaderInSection autolayout - larghezza pin

ho inizialmente creare una vista del genere:

UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 50)]; 

poi aggiungere un po subviews utilizzando Autolayout poi tornare il headerView

Il problema che ho è che non voglio specificare in particolare la dimensione headerView. Voglio usare Autolayout per pin left & bordi a destra per la larghezza della vista. Ecco il problema, non ho superview da utilizzare nel codice di Autolayout.

L'utilizzo del codice precedente indica che la vista dell'intestazione non esegue l'autorizzazione automatica alla rotazione. È necessario ricaricare il tableview dopo la rotazione.

Qualche idea su come impostare headerView per appuntare i bordi sul tableview?

Grazie

risposta

2

Dal mio test, e questa risposta here, il UIView tornato da quel metodo automaticamente ha la sua origine impostato (0, 0), la sua altezza impostata sul valore restituito da -tableView: heightForHeaderInSection: e la sua larghezza impostare la larghezza della UITableView.

Sono stato in grado di aggiungere controlli a quello UIView e persino disporli con il layout automatico senza specificare alcun particolare dimensionamento nel metodo init.

Ecco il mio codice per creare la vista intestazione:

self.headerView = [[UIView alloc] init]; 

Ecco il codice in cui giacevo i controlli all'interno della vista intestazione:

- (void)layoutControls { 
    [self.headerView addSubview:self.segmentedControl]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[control]-(margin)-|" 
                      options:0 
                      metrics:@{@"margin": @(self.segmentedControlLeftRightMargin)} 
                       views:@{@"control": self.segmentedControl}]]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[control(==height)]" 
                      options:0 
                      metrics:@{@"margin": @(self.segmentedControlTopMargin), 
                         @"height": @(self.segmentedControlHeight)} 
                       views:@{@"control": self.segmentedControl}]]; 

    [self.headerView addSubview:self.searchBar]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[control]-(margin)-|" 
                      options:0 
                      metrics:@{@"margin": @(self.searchBarLeftRightMargin)} 
                       views:@{@"control": self.searchBar}]]; 
    [self.headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[control1]-(margin1)-[control2]-(margin2)-|" 
                      options:0 
                      metrics:@{@"margin1": @(self.segmentedControlBottomMargin), 
                         @"margin2": @(self.searchBarBottomMargin)} 
                       views:@{@"control1": self.segmentedControl, 
                         @"control2": self.searchBar}]]; 

} 

Questi sono i metodi per il Protocollo UITableViewDelgate:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    // The hard-coded values are accurate for my controls, but you might need more advanced logic 
    return 44.0f + self.segmentedControlBottomMargin + 44.0f + self.searchBarBottomMargin; 
} 
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    return self.headerView; 
} 
+0

Grazie, ho imparato qualcosa, restituendo una vista zerorect utilizza il corretto completo dimensione, quindi non è necessario utilizzare tableview.bounds, tuttavia questo non corregge durante la rotazione. Devi ricaricare la tableview. Suppongo che non ci sia superview per appuntare i bordi. – Darren

+0

Sì, sembra essere trattato "fuori dai limiti" del layout automatico. Quando ho avuto bisogno di questo comportamento in passato, in realtà ho sottotitolato 'UITableViewCell' e ho usato quella invece delle intestazioni di sezione. Se effettivamente usi le sezioni, potrebbe essere solo la cella per la riga 0 (zero). In questo modo, tu ** DO ** ottieni il supporto per la rotazione. – mbm29414

+0

In realtà non è una cattiva idea. In effetti, ciò fermerebbe anche l'intestazione della sezione sullo schermo quando la tabella scorre. – Darren

Problemi correlati