2012-11-28 9 views
6

Giusto per chiarire, non sto chiedendo come impostare l'altezza della riga una volta all'inizio quando UIpickerview è stato impostato. So che usi pickerView: rowHeightForComponent per quello scopo.Come posso modificare dinamicamente l'altezza della riga di un UIpickerview per tutta la sua durata?

Tuttavia, quello che mi chiedo è se voglio pickerView: rowHeightForComponent per restituire un valore variabile, dove il valore può cambiare durante il corso della vita del UIPickerView, ad esempio, in risposta al clic di un pulsante o il cambiamento di un default ambientazione.

Ho trovato che, sfortunatamente, pickerView: rowHeightForComponent viene chiamato una sola volta, all'inizio, quando iOS sta configurando UIpickerview. Dopodiché, non chiama mai pickerView: rowHeightForComponent di nuovo, quindi non può raccogliere la modifica del valore che pickerView: rowHeightForComponent restituirebbe se solo fosse chiamato di nuovo.

Suppongo che potrei semplicemente rilasciare UIpickerview e configurarne un altro, costringendo iOS a chiamare pickerView: rowHeightForComponent di nuovo, ma questo potrebbe essere scomodo e potrebbe richiedere il salvataggio delle informazioni di stato. C'è un altro modo più semplice per modificare dinamicamente l'altezza della riga? Grazie!

ricerca in giro, ho trovato Changing UIPickerView row height (che è solo per la configurazione iniziale del l'altezza della riga) e How to change the size of row in UIPickerView by button click?, che parla del metodo rowSizeForComponent, che sembra utilizzare solo un valore memorizzato nella cache per l'altezza della riga.

Ecco la parte di codice che tenta di modificare l'altezza delle righe, insieme a reloadAllComponents test: come suggerito da @RileyE

NSLog(@"before, scrollviewSpacing is %d", self.mainViewController.IACscrollviewSpacing); 
if (0.0 != fromDefaultsScrollviewSpacing) { 
    self.mainViewController.IACscrollviewSpacing = (UInt8) round (60.0 - fromDefaultsScrollviewSpacing); 
} 
NSLog(@"now scrollviewSpacing is %d", self.mainViewController.IACscrollviewSpacing); 
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height); 
[self.mainViewController.PickIPAddress reloadAllComponents]; 
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height); 
[self.mainViewController.PickIPAddress reloadComponent:1]; 
NSLog(@"rowsizeforcomponent height is %f", [self.mainViewController.PickIPAddress rowSizeForComponent:1].height); 

che dà il seguente output sulla console:

2012 -11-29 02: 32: 14.681 Calcolatrice indirizzo IP [6404: c07] prima, scrollviewSpacing è 39
2012-11-29 02: 32: 18.913 Calcolatrice indirizzo IP [6404: c07] ora scrollviewSpacing è 22
2012- 11- 29 02: 32: 20.196 Calcolatrice indirizzo IP [6404: c07] rowsizeforcomponent height is 39.000000 2012-11-29 02: 32: 28.865 Calcolatrice indirizzo IP [6404: c07] rowsizeper l'altezza del componente è 39.000000 2012-11-29 02:32 : 30,903 IP Address Calculator [6404: c07] altezza rowsizeforcomponent è 39,000000

e in MainViewController (che è l'UIpickerviewdelegate), ho

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component { 
return self.IACscrollviewSpacing; } 

Inoltre, ho impostato un punto di interruzione qui, e vedo viene chiamato solo quando l'UIPickerview viene inizialmente impostato e mai più.

+0

Stai dicendo che 'rowHeightForComponent:' viene richiamato di nuovo se chiami 'reloadComponent:' nella vista di selezione? – rmaddy

+0

Sto dicendo che reloadAllComponents: non chiama rowHeightForComponent: di nuovo, che è un problema per me. Se lo fa, allora prenderà il nuovo valore che voglio usare per l'altezza della riga. – auspicious99

+0

Scusate, ho avuto un errore di battitura. Intendevo dire "non si chiama", non "si chiama". L'hai confermato ora. Questo è inaspettato. – rmaddy

risposta

0

Tutti i metodi delegato vengono chiamati di nuovo e aggiornati quando si chiama [yourPicker reloadAllComponents];

Scopri i UIPickerView e UIPickerViewDelegate documenti. Consulta la sezione "Ricaricare il selettore di viste", in particolare.

+0

Leggi di nuovo la domanda. Non si tratta di visualizzazioni da tavolo. – rmaddy

+0

Grazie, ma è un UIpickerview, non un UItableview. Non esiste un metodo reloadData. C'è reloadAllComponents o reloadComponent: ma questi leggono solo di nuovo i dati (metodi del protocollo UIpickerviewdatasource), e non chiamano i metodi dei protocolli UIpickerviewDelegate (almeno, non pickerView: rowHeightForComponent). – auspicious99

+0

@ auspicious99 Va bene. Bene, ho aggiornato la mia domanda. – RileyE

0

Io non sono sicuro se UIPickerView può cambiare dinamicamente l'altezza delle righe.

ma ho fatto implementare un selettore di vista nome DLPickerView. È possibile restituire un'altezza diversa per una riga diversa.Teoricamente può anche cambiare l'altezza della riga per tutta la sua durata

Problemi correlati