2016-04-29 29 views
6

Ho un pulsante in un UITableViewCell che è memorizzato come un ivar chiamato currentButton. Quando viene cliccato quel pulsante, un UIView contenente UIPickerView e UIToolBar viene richiamato e visualizzato nella parte inferiore dello schermo. Tuttavia, ho guardato altri post per ore e questo codice seguente non funziona ancora. Le celle a volte scorrono verso il basso sotto la tastiera e le celle completamente nella parte inferiore di UITableView non scorrono abbastanza per andare in cima a UIView backgroundPickerView. Questo è il mio codice:Scorri UITableViewCell a visibile non funzionante come previsto

CGPoint center = currentButton.center; 
    CGPoint rootViewPoint = [currentButton.superview convertPoint:center toView:self.view]; 
    NSIndexPath *indexPath = [measurementTableView indexPathForRowAtPoint:rootViewPoint]; 
    CGRect cellRect = [measurementTableView rectForRowAtIndexPath:indexPath]; 
    if (cellRect.origin.y + cellRect.size.height >= backgroundPickerView.frame.origin.y) { 
     [measurementTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
     CGPoint offset = measurementTableView.contentOffset; 
     offset.y += ((cellRect.origin.y - cellRect.size.height) - backgroundPickerView.frame.origin.y); 
     [measurementTableView setContentOffset:offset animated:YES]; 
    } 

Qualcuno vede cosa sto facendo male qui?

+0

È self.view e measurementTableVedere la stessa vista? – wj2061

+0

@ wj2061 no, self.view contiene measurementTableView –

+0

Hai trovato qualche soluzione o no? –

risposta

5

Questo codice ha funzionato per me. Usa un approccio diverso da quelli suggeriti qui ed è buono per quello di cui ho bisogno.

CGRect buttonFrame = [currentButton convertRect:currentButton.bounds toView:measurementTableView]; 
NSIndexPath *indexPath = [measurementTableView indexPathForRowAtPoint:buttonFrame.origin]; 
CGRect backPickFrame = [backgroundPickerView convertRect:backgroundPickerView.bounds toView:measurementTableView]; 
if (buttonFrame.origin.y + buttonFrame.size.height >= backPickFrame.origin.y) { 
    measurementTableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, backgroundPickerView.frame.size.height, 0.0); 
    [measurementTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
} else { 
    [measurementTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 
5

UITableViewCell viene riutilizzato, mantenere un riferimento di subView di UITableViewCell non è un buon approccio.
Se lo speciale UITableViewCell non è in UITableView visibleCells, la sua cornice non è definita.
Una soluzione è:

  1. Creare un costume UITableViewCell che ha la stessa struttura di cui hai bisogno.

  2. Conservare un riferimento del percorso di indice per UITableViewCell personalizzato.

  3. Utilizzare questo percorso indice per eseguire il lavoro.

Spero che questo funzionerà:

[measurementTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];  
CGPoint offset = measurementTableView.contentOffset;  
offset.y += backgroundPickerView.frame.height; 
3

primo problema è che UITableView è parzialmente nascosto sotto la tastiera. Quindi, quando provi a scorrere verso la parte inferiore della tabella delle righe, la restituzione e il contenuto richiesto non sono visibili.

Per risolvere questo problema quando viene visualizzata/nascosta la tastiera, sono disponibili due opzioni.

  • valore aggiornamento self.tableView.contentInstet.bottom per tener conto delle dimensioni tastiera
  • aggiornamento cornice di tavolo, se si utilizza la configurazione automatica quindi migliore approccio sarà modificare parte costante di vincolo inferiore (IMO questo è l'approccio migliore).

Dopo aver fatto questo si può fare questo:

CGRect rectToBeVisible = [currentButton convertRect: currentButton.bounds 
              toView: self.tableView]; 
[self.tableView scrollRectToVisible: rectToBeVisible animated: YES]; 

ho potuto incasinato vista a cui la conversione deve essere eseguita, in modo da sperimentare un po ', ma il concetto generale dovrebbe essere chiaro.