2015-02-27 15 views
9

Devo implementare un UIPickerView per scegliere ore, minuti e secondi. Ho bisogno di avere un'etichetta, accanto a ciascun componente che rimane fisso quando il picker gira. Ad esempio, puoi guardare la sezione timer dell'app Apple Clock. Inserisco un'immagine per riferimentoUiPickerView con etichetta fissa personalizzata e autoinserimento

enter image description here

naturalmente bisogno di un selettore con 3 componenti ma il problema è lo stesso. Ho trovato molte soluzioni per aggiungere un'etichetta come subview e posizionarla usando alcuni frame e aggiustamenti manuali ma non riesco a farlo funzionare con AutoLayout e non trovo una soluzione sul web. Qualcuno ha risolto questo problema? grazie

+0

Qual è il motivo particolare per il layout automatico? Non è realmente possibile con mezzi semplici perché le parti interne della vista di selezione non sono esposte, quindi la creazione di vincoli contro la gerarchia interna è soggetta a errore e non è raccomandata. In questo caso, vorrei creare una sottoclasse di un 'UIPickerView' (come' UIDatePicker' di Apple) e implementare tutta la logica lì usando le posizioni dei frame calcolate. –

+0

Capisco il tuo punto di vista così invece di Autolayout la domanda diventa "come implementare una sottoclasse' UIPickerView' che funziona con tutte le dimensioni dello schermo e anche in orientamento orizzontale e verticale dello schermo – Luca

+0

Per la cronaca, UIDatePicker di Apple NON sottoclasse UIPickerView. – quickthyme

risposta

-1

ho affrontato un problema simile in un App ho lavorato su e ha deciso quanto segue:

i. Crea UIPicker

ii. Trova il punto medio delle righe di selezione presentate.

iii. Aggiungi due UILabels allo schermo e in - (void)layoutSubview; assicurati che le etichette siano sempre posizionate accanto ai punti medi.

Ho solo bisogno di supporto in modalità verticale nel mio progetto, ma dovrebbe funzionare anche per il paesaggio. Basta scegliere una larghezza sufficiente, la larghezza della riga, in modo da non sovrapporre i dati all'interno del selettore. Ecco un frammento di codice per UIPicker:

#pragma mark - Picker View 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 2; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    if(component == 0) { 
     return self.hourPickerData.count; 
    } else { 
     return self.minutePickerData.count; 
    } 
} 

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { 
    return 40; 
} 

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component 
{ 
    return 30; 
} 

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
{ 
    NSString *text; 

    if(component == 0) { 
     text = self.hourPickerData[row]; 
    } else { 
     text = self.minutePickerData[row]; 
    } 

    UILabel *label = (UILabel*)view; 
    if(view == nil) { 
     label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.text = text; 
     label.textAlignment = NSTextAlignmentCenter; 
     label.textColor = LYTiT_HEADER_COLOR; 
     label.font = [UIFont fontWithName:LT_HELVETICA size:16]; 
    } 

    return label; 
} 
+1

Non capisco la tua soluzione proposta. – Luca

+0

@Luca - potresti per favore approfondire su quale parte non capisci? – trdavidson

+0

Ho bisogno di un'etichetta fissa accanto a ciascun componente dell 'UIPickerView e non capisco come posizionare il fisso etichetta accanto ai componenti nel metodo di sottoscheda layout – Luca

0

Ho pensato che altri potrebbero beneficiare della mia risposta aggiuntiva.

Per i componenti di I, il seguente dovrebbe essere nel vostro metodo di inizializzazione pickerView (viewDidLoad),

float fontSize = 20; 
    float labelWidth = self.view.frame.size.width/[self.myPickerView numberOfComponents]; 
    float y = (self.myPickerView.frame.size.height/2) - (fontSize/2); 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(labelWidth* i, y, labelWidth, fontSize)]; 
    label.text = @"Label"; 
    label.font = [UIFont boldSystemFontOfSize:fontSize]; 
    label.backgroundColor = [UIColor clearColor]; 
    label.shadowColor = [UIColor whiteColor]; 
    label.shadowOffset = CGSizeMake (0,1); 
    label.textAlignment = NSTextAlignmentRight; 


    [self.myPickerView insertSubview:label aboveSubview:[self.myPickerView.subviews objectAtIndex:[self.myPickerView.subviews count] - 1]]; 
Problemi correlati