2011-08-16 11 views

risposta

35

Per rendere il cursore "stick" in punti specifici, il viewcontroller deve, nel metodo valueChanged collegato dal cursore, determinare l'arrotondato appropriato dal valore del cursore e quindi utilizzare setValue: animato: per spostare il cursore sul luogo appropriato Quindi, se il tuo slider va da 0 a 2, e l'utente lo cambia a 0.75, supponi che questo dovrebbe essere 1 e impostare il valore del cursore su quello.

+5

Come dice Nathan di seguito, utilizzare "Ritocco interno" perché lampeggerà durante il trascinamento se si utilizza valueChanged – Zenuka

+1

Ciò vale solo se il dispositivo di scorrimento è continuo, ma sì, in tal caso è una soluzione migliore – jrturton

60

I passaggi che ho seguito sono stati più o meno gli stessi di quelli della risposta di Jrturton, ma ho scoperto che il dispositivo di scorrimento sarebbe in qualche modo in ritardo rispetto ai miei movimenti. Ecco come ho fatto questo:

Metti il ​​cursore nella vista in Interface Builder. Imposta i valori min/max del cursore. (Io ho usato 0 e 5)

Nel file .h:

@property (strong, nonatomic) IBOutlet UISlider *mySlider; 
- (IBAction)sliderChanged:(id)sender; 

Nel file .m:

- (IBAction)sliderChanged:(id)sender 
{ 
    int sliderValue; 
    sliderValue = lroundf(mySlider.value); 
    [mySlider setValue:sliderValue animated:YES]; 
} 

Dopo questo in Interface Builder ho collegato il 'tocco Inside 'evento per il dispositivo di scorrimento a Proprietario del file, piuttosto che' Valore modificato '. Ora mi consente di spostare agevolmente il cursore e scatta su ogni numero intero quando il mio dito viene sollevato.

Grazie @jrturton!

UPDATE - Swift:

@IBOutlet var mySlider: UISlider! 

@IBAction func sliderMoved(sender: UISlider) { 
    sender.setValue(Float(lroundf(mySlider.value)), animated: true) 
} 

anche se non v'è alcuna confusione sulle cose aggancio nello storyboard ho caricato un esempio veloce per GitHub: https://github.com/nathandries/StickySlider

+2

Bello ma è " ll round down. lroundf arriverà al numero intero più vicino. –

+1

Vorrei usare anche "Touch Up Outside" – Zenuka

5

Quello che ho fatto per questo è per prima cosa impostare una variabile "output" del valore corrente del cursore su un intero (è un float di default). Quindi impostare il numero di uscita come valore corrente del cursore:

int output = (int)mySlider.value; 
mySlider.value = output; 

Questo imposterà per spostare in incrementi di 1 interi. Per farlo muovere in un intervallo specifico di numeri, ad esempio, in 5 secondi, modifica il valore di output con la seguente formula. Aggiungilo tra le prime due righe sopra:

int output = (int)mySlider.value; 
int newValue = 5 * floor((output/5)+0.5); 
mySlider.value = newValue; 

Ora il tuo cursore "salta" a multipli di 5 mentre lo sposti.

4

ho fatto come suggerito Nathan, ma voglio anche aggiornare associato un UILabel visualizzando il valore corrente in tempo reale, ecco quello che ho fatto:

- (IBAction) countdownSliderChanged:(id)sender 
{ 
    // Action Hooked to 'Value Changed' (continuous) 

    // Update label (to rounded value) 

    CGFloat value = [_countdownSlider value]; 

    CGFloat roundValue = roundf(value); 

    [_countdownLabel setText:[NSString stringWithFormat:@" %2.0f 秒", roundValue]]; 
} 


- (IBAction) countdownSliderFinishedEditing:(id)sender 
{ 
    // Action Hooked to 'Touch Up Inside' (when user releases knob) 

    // Adjust knob (to rounded value) 

    CGFloat value = [_countdownSlider value]; 

    CGFloat roundValue = roundf(value); 

    if (value != roundValue) { 
     // Almost 100% of the time - Adjust: 

     [_countdownSlider setValue:roundValue]; 
    } 
} 

Lo svantaggio, naturalmente, è che prende due azioni (metodi) per cursore.

Problemi correlati