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
.
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. –
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
Sì, sembra che ci siano problemi usando i vincoli su l'intestazione della tabella. Ho pubblicato una soluzione di lavoro semplice per te. –