2015-12-23 17 views
5

Vorrei impostare UITableView in modo che corrisponda all'altezza di tutti i contenuti nella vista tabella.Altezza UITableView dinamica

Questo è il mio storyboard

enter image description here

Il problema di questo è la parte superiore e ImageView fondo è sempre statica sullo schermo.

enter image description here

Il vi sono supponiamo di essere di 10 elementi sul tavolo vista ma solo 7 mostra fino dovuto limitazione dimensioni dello schermo. Vorrei mostrare tutti i 10 prima che l'utente sia in grado di vedere il basso ImageView. (A proposito, tutti e 3 le viste ie. Entrambe le viste dell'immagine e Tableview è in un'UIScrollView)

IDEAL

enter image description here

Alcune delle altre limitazioni che devo lavorare con è che il numero di elementi nella vista tabella è dinamico, il che significa che può essere in qualsiasi quantità di solito inferiore a 10 che in seguito recupererò da un'API. E l'altezza della cella è anche dinamica a seconda dei contenuti.

ho appena iniziato con qualche semplice codice

class ExampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
     @IBOutlet weak var tableView: UITableView! 

    var items: [String] = [ 
    "Item 01", "Item 02", "Item 03", "Item 04", "Item 05", 
    "Item 06", "Item 07", "Item 08", "Item 09", "Item 10"] 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.items.count; 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell 
    cell.textLabel?.text = self.items[indexPath.row] 
    return cell 
    } 

} 
+0

hai provato self.items.count * row_height questo darà l'altezza in base al contenuto, ma è necessario scrivere altre condizioni per controllare l'altezza dello schermo anche – Smile

+0

Perché non aggiungi l'immagine superiore e quella inferiore nell'intestazione e piè di pagina di tableview? – Muneeba

+0

Intestazioni e piè di pagina non funzionano in realtà perché l'immagine superiore e inferiore è solo un rappresentante delle visualizzazioni. In realtà, è una vista con molti più componenti, etichette, immagini e vincoli. – WKL

risposta

2

è necessario impostare un IBOutlet al NSLayoutConstraint che imposta la tableView altezza (prima è necessario creare la vincolo di altezza con qualsiasi valore, non importa) e quindi ctrl trascinalo sul tuo file di classe

enter image description here

Quindi nel tuo viewWillAppear devi calcolare l'altezza tableView e impostarlo.Come questo:

var tableViewHeight:CGFloat = 0; 
for (var i = tableView(self.tableView , numberOfRowsInSection: 0) - 1; i>0; i-=1){ 
    tableViewHeight = height + tableView(self.tableView, heightForRowAtIndexPath: NSIndexPath(forRow: i, inSection: 0)) 
} 
tableViewHeightLayout.constant = tableViewHeight 

E questo è praticamente tutto. Questo darà la dimensione del contenuto di scrollView e non dovrebbe generare alcun avviso.

1

In tal caso, non fate la vostra cella in basso statica, ne fanno una parte di vista tabella e inserire questa immagine in basso in ultima fila utilizzando la tabella visualizza metodo delegato - insertRowAtIndexPath

1

In questo tipo di caso, aggiungere la vista inferiore dell'immagine (rossa) in una visualizzazione di tabella.

Per aggiungere vista piè di pagina in UITableView è possibile utilizzare:

tableViewObj.tableFooterView = footerViewObj; 
1

Probabilmente devono dare attuazione alla dimensione contenuto intrinseco vista tabella. Si prega di controllare questo answer per vedere se aiuta.

Mi ricordo di aver riscontrato questo problema e persino creato una sottoclasse personalizzata UITableView.

#import "IntrinsicTableView.h" 

@implementation IntrinsicTableView 

#pragma mark - UIView 

- (CGSize)intrinsicContentSize 
{ 
    return CGSizeMake(UIViewNoIntrinsicMetric, self.contentSize.height); 
} 

#pragma mark - UITableView 

- (void)endUpdates 
{ 
    [super endUpdates]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadData 
{ 
    [super reloadData]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super reloadSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super insertSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super deleteRowsAtIndexPaths:indexPaths withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 
{ 
    [super deleteSections:sections withRowAnimation:animation]; 
    [self invalidateIntrinsicContentSize]; 
} 

@end 
1

Prova anche questo

in ViewDidLoad 

self.table.estimatedRowHeight = 44.0 ; 
self.table.rowHeight = UITableViewAutomaticDimension; 

altezza per riga in percorso dell'indice

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
return UITableViewAutomaticDimension;} 
4
  1. sottoclasse tua UITableView eseguire l'override del intrinsicContentSize essere la sua contentSize, in questo modo:

    override var intrinsicContentSize: CGSize { 
        return contentSize 
    } 
    
  2. Quindi utilizzare altezze automatico delle righe per la vostra tavola, in modo viewDidLoad del exampleViewController avrebbe:

    tableView.estimatedRowHeight = 44 
    

    E la funzione UITableViewDelegate:

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
        return UITableViewAutomaticDimension 
    } 
    
  3. Quando si ricevono dati dal vostro API e ricaricare il vostro tavolo, basta chiamare:

    tableView.invalidateIntrinsicContentSize() 
    

    Questo dirà il vostro tavolo per ridimensionare stesso per la stessa dimensione come il suo contenuto (a causa della sostituzione), e sposta la tua immagine di fondo secondo necessità.


Se il vostro storyboard genera un errore dicendo che il vostro UIScrollView ha un'altezza ambigua perché non c'è nessun vincolo di altezza sul UITableView, selezionare l'UITableView e dargli un segnaposto dimensione intrinseca in Impostazioni Size.

+1

fantastico! Non posso davvero credere che questo non faccia parte di iOS. Non è un caso d'uso veramente comune? –

+0

grazie @MartinMassera! Sono d'accordo, mi ci è voluto un po 'per capire come fare al meglio, ma ho usato questo approccio diverse volte. Non volevo sottoclasse, ma pensavo che fosse ancora il più pulito invece di aggiornare manualmente i vincoli. – Cody

+0

fantastico! soluzione migliore – Mikhail

Problemi correlati