2015-05-12 15 views
7

Utilizzando Storyboard e Autolayout, ho un UIViewController con un UIScrollView come vista principale. Ho diverse viste del contenitore incorporate nella vista di scorrimento. Alcune di queste viste contenitore incorporate contengono UITableViews, ognuna con celle di diversa altezza. Avrò bisogno che l'altezza del TableView sia abbastanza grande da mostrare tutte le celle contemporaneamente, poiché lo scrolling sarà disabilitato sul TableView.Regolare l'altezza della vista del contenitore in modo che corrisponda a UITableView incorporato

Nel controllore UIView principale, l'altezza della vista del contenitore deve essere definita affinché la vista di scorrimento funzioni correttamente. Questo è problematico perché non c'è modo per me di sapere quanto sarà grande il mio tableView una volta che tutte le sue celle di altezze variabili avranno finito il rendering. Come posso regolare l'altezza della vista del contenitore in fase di runtime per adattarla al mio UITableView senza scorrimento?

Finora, ho fatto quanto segue:

// in embedded UITableViewController 
// 
- (void)viewDidLoad { 
    // force layout early so I can determine my table's height 
    [self.tableView layoutIfNeeded]; 

    if (self.detailsDelegate) { 
     [self.detailsTableDelegate didDetermineHeightForDetailsTableView:self.tableView]; 
    } 
} 

// in my main UIViewController 
// I have an IBOutlet to a height constraint set up on my container view 
// this initial height constraint is just temporary, and will be overridden 
// once this delegate method is called 
- (void)didDetermineHeightForDetailsTableView:(UITableView *)tableView 
{ 
    self.detailsContainerHeightConstraint.constant = tableView.contentSize.height; 
} 

Questo sta lavorando bene e sono rimasto soddisfatto dei risultati. Tuttavia, aggiungo una o due ulteriori visualizzazioni del contenitore, che avranno tabelleViews non scorrevoli, e odio dover creare un nuovo protocollo delegato per ogni vista del contenitore. Non penso di poter rendere il protocollo generico.

Qualche idea?

+0

Sono di fronte a un problema simile. Hai trovato una soluzione per questo? – ntsh

+0

@ntsh Ho appena aggiunto la mia risposta. dai un'occhiata e vedi se questo ti aiuta – djibouti33

+0

Grazie. Anch'io ho finito con una soluzione simile usando contentView di tableView. – ntsh

risposta

1

Ecco quello che ho finito per fare:

// In my embedded UITableViewController: 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    self.tableView.estimatedRowHeight = 60.0; 

    // via storyboards, this viewController has been embeded in a containerView, which is 
    // in a scrollView, which demands a height constraint. some rows from our static tableView 
    // might not display (for lack of data), so we need to send our table's height. we'll force 
    // layout early so we can get our size, and then pass it up to our delegate so it can set 
    // the containerView's heightConstraint. 
    [self.tableView layoutIfNeeded]; 

    self.sizeForEmbeddingInContainerView = self.tableView.contentSize; 
} 

// in another embedded view controller:  
- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    self.sizeForEmbeddingInContainerView = self.tableView.contentSize; 
} 

// then, in the parent view controller, I do this: 
// 1) ensure each container view in the storyboard has an outlet to a height constraint 
// 2) add this: 
- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    self.placeDetailsContainerHeightConstraint.constant = self.placeDetailsTableViewController.sizeForEmbeddingInContainerView.height; 
    self.secondaryExperiencesContainerHeightConstraint.constant = self.secondaryExperiencesViewController.sizeForEmbeddingInContainerView.height; 
} 

non l'ho ancora fatto, ma probabilmente sarebbe meglio per creare un protocollo con una proprietà di CGSize sizeForEmbeddingInContainerView che ogni controller di vista bambino può adottare.

+0

Avete implementato questo è funzionante @ djibouti33 –

+0

Credo di aver finito per creare il protocollo invece. – djibouti33

1

Ecco cosa ha funzionato perfettamente per me.

- (void)updateSizeBasedOnChildViews { 

    // Set height of container to match embedded tableview 
    CGRect containerFrame = self.cardTableContainer.frame; 
    containerFrame.size.height = [[[self.cardTableContainer subviews] lastObject]contentSize].height; 
    self.cardTableContainer.frame = containerFrame; 

    // Set content height of scrollview according to container 
    CGRect scrollFrame = self.cardTabScrollView.frame; 
    scrollFrame.size.height = containerFrame.origin.y + containerFrame.size.height; 
      // + height of any other subviews below the container 
    self.cardTabScrollView.contentSize = scrollFrame.size; 
} 
+0

Dove hai posto questa chiamata - quale metodo? Il mio problema è che provo a farlo subito dopo MoveToParentViewController e il controller non è ancora stato caricato, ma non riesco a capire come consentire al controller di visualizzazione contenitore di sapere quando il bambino è caricato. – SAHM

+0

@SAHM Nel mio caso, l'ho chiamato dopo aver impostato i dati per tableViewController (che chiama [tableView reloadData]). Tuttavia era più di 2 anni fa, quindi non ricordo i dettagli esatti. Il mio codice finale era: in viewDidAppear: '' '[self updateChildViewData]' '' e quindi '' '- (void) updateChildViewData {[self updateChildTableVCData]; [self updateSizeBasedOnChildViews]}' '' – ntsh

Problemi correlati