2015-06-25 2 views
7

Ho una vista tabella con una vista dell'intestazione della tabella creata tramite il generatore di interfacce all'interno dello stesso xib. Voglio impostare l'altezza dell'intestazione in base alle dimensioni dello schermo, ad esempio il 50% dell'altezza dello schermo.UITableView: imposta l'altezza della vista dell'intestazione della tabella in base alla dimensione dello schermo

Ecco che cosa ottengo con un'altezza statica su un iPhone 4s:

Tableview header in iPhone 4s

E qui si è ciò che ottengo su un iPhone 6:

Tableview header in iPhone 6

Si noti che il contenuto dell'intestazione è statico.

Non riesco a impostare i vincoli sull'intestazione utilizzando il layout automatico. Ho provato a impostare un vincolo di altezza in base all'altezza della vista tabella, ma non sembra possibile nel builder dell'interfaccia. Il controllo del trascinamento non funziona. Non riesco a trascinare una linea dall'intestazione alla vista tabella o persino all'intestazione stessa.

enter image description here

Come posso impostare l'altezza della testata in base alle dimensioni dello schermo?

+0

Aggiungere un vincolo di altezza per la vista dell'intestazione in Generatore di interfacce e CTRL Trascinarlo nel file di intestazione per creare un IBOutlet. In viewDidLoad, imposta il valore del vincolo a 'yourOutlet.constant = [[UIScreen mainScreen] bound] .size.height/2'.A rotazione, dovrai anche resettare la costante. –

+0

Grazie, ma non posso aggiungere un vincolo alla vista dell'intestazione uiview, ho aggiornato la domanda e allegato un'immagine per favore dai un'occhiata alla sezione "Modifica" della mia domanda – Aladin

+0

Sì, sembra che ci siano problemi usando i vincoli su l'intestazione della tabella. Ho pubblicato una soluzione di lavoro semplice per te. –

risposta

8

Sfortunatamente, le visualizzazioni dell'intestazione della tabella non possono essere ridimensionate utilizzando il layout automatico. È possibile utilizzare il layout automatico per gli elementi all'interno dell'intestazione, ma è necessario specificare le dimensioni dell'intestazione impostando esplicitamente la propria cornice. Se l'altezza dell'intestazione è statica e nota al momento della compilazione, puoi usare IB. Tuttavia, se l'altezza è dinamica o dipende dal dispositivo (come nel tuo caso), devi impostarlo in codice.

Una soluzione abbastanza flessibile sarebbe quella di creare una sottoclasse personalizzata di UITableView e adattare il frame dell'intestazione nel metodo layoutSubviews. In questo modo le dimensioni dell'intestazione vengono regolate automaticamente quando viene ridimensionata la vista tabella. Devi fare attenzione, tuttavia, a riapplicare la cornice dell'intestazione solo quando è effettivamente necessaria una modifica per evitare un loop infinito.

Ecco cosa sarebbe simile in Objective-C:

@interface MyTableView : UITableView 
@end 

@implementation MyTableView : UITableView 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    if (self.tableHeaderView) { 
     UIView *header = self.tableHeaderView; 
     CGRect rect = CGRectMake(0, 0, self.bounds.size.width, 
           self.bounds.size.height/2); 

     // Only adjust frame if needed to avoid infinite loop 
     if (!CGRectEqualToRect(self.tableHeaderView.frame, rect)) { 
      header.frame = rect; 

      // This will apply the new header size and trigger another 
      // call of layoutSubviews 
      self.tableHeaderView = header; 
     } 
    } 
} 

@end 

La versione Swift si presenta così:

class MyTableView: UITableView { 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     if let header = tableHeaderView { 
      let rect = CGRectMake(0, 0, bounds.size.width, bounds.size.height/2) 

      // Only adjust frame if needed to avoid infinite loop 
      if !CGRectEqualToRect(header.frame, rect) { 
       header.frame = rect 

       // This will apply the new header size and trigger 
       // another call of layoutSubviews 
       tableHeaderView = header 
      } 
     } 
    } 

} 

Si noti che i frammenti di cui sopra utilizzare i confini della vista tabella piuttosto che le dimensioni dello schermo per calcolare le dimensioni dell'intestazione.

Aggiornamento: Nota che a volte è necessario un ulteriore invito a layoutIfNeeded dopo impostare la proprietà tableHeaderView. Ho riscontrato un problema in cui le intestazioni di sezione venivano disegnate sopra la vista dell'intestazione senza chiamare layoutIfNeeded.

1

Ho provato il seguente codice e sembra funzionare su iOS7 e iOS8. Cambia l'altezza del frame dell'intestazione a metà dell'altezza dello schermo. Potresti voler sottrarre l'altezza della barra di navigazione e di stato dall'altezza dello schermo prima di/2, se l'intestazione deve avere solo la metà delle dimensioni dell'area di visualizzazione della tabella.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Your other code 

    // Set the table header height 
    CGRect headerFrame = self.tableView.tableHeaderView.frame; 
    headerFrame.size.height = [[UIScreen mainScreen] bounds].size.height/2; 
    self.tableView.tableHeaderView.frame=headerFrame; 
}