iOS jak zatrzymać suwak w dyskretnych punktach

Chciałbym zatrzymać suwak w dyskretnych punktach, które reprezentują liczby całkowite na osi czasu. Jak najlepiej to zrobić? Nie chcę żadnych wartości pomiędzy. Byłoby świetnie, gdyby suwak mógł" przystawać " do pozycji w każdym dyskretnym punkcie.

Author: meagar, 2011-08-16

4 answers

Aby suwak" przyklejał się " w określonych punktach, twój kontroler viewcontroller powinien w metodzie valueChanged powiązanej z suwakiem określić odpowiednie zaokrąglenie z wartości suwaka, a następnie użyć setValue: animated:, aby przesunąć suwak w odpowiednie miejsce. Tak więc, jeśli twój suwak zmieni się z 0 do 2, a użytkownik zmieni go na 0.75, Zakładamy, że powinno to być 1 i ustawiamy na to wartość suwaka.

 36
Author: jrturton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-16 19:23:40

Kroki, które podjąłem tutaj były prawie takie same, jak w odpowiedzi jrturtona, ale odkryłem, że suwak będzie w pewnym sensie opóźniał moje ruchy dość wyraźnie. Oto jak to zrobiłem:

Umieść suwak w widoku w Interface Builder. Ustaw wartości min / max suwaka. (Użyłem 0 i 5)

W .plik h:

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

W .plik m:

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

Po tym w Interface Builder podłączyłem Zdarzenie "Touch Up Inside" dla suwaka do pliku Właściciel, a nie "Wartość zmieniona". Teraz pozwala mi płynnie przesuwać suwak i zatrzaskuje się do każdej liczby całkowitej po uniesieniu palca.

Dzięki @jrturton!

UPDATE - Swift:

@IBOutlet var mySlider: UISlider!

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

Również jeśli jest jakiś błąd w podłączaniu rzeczy w storyboardzie, załadowałem szybki przykład na github: https://github.com/nathandries/StickySlider

 60
Author: Nathan Dries,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-26 00:40:09

To, co zrobiłem dla tego jest najpierw ustawić zmienną "output" bieżącej wartości suwaka na liczbę całkowitą(domyślnie jest zmienną zmienną zmienną zmienną zmienną). Następnie Ustaw liczbę wyjściową jako bieżącą wartość suwaka:

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

To ustawi ruch w krokach o 1 liczbę całkowitą. Aby poruszać się w określonym zakresie liczb, na przykład w 5s, zmodyfikuj wartość wyjściową za pomocą następującego wzoru. Dodaj to między dwoma pierwszymi liniami powyżej:

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

Teraz twój suwak "skacze" do wielokrotności 5 jako ruszaj się.

 5
Author: ctlockey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 23:49:29

Zrobiłem tak, jak Nathan zasugerował, ale chcę również zaktualizować skojarzoną UILabel wyświetlającą bieżącą wartość w czasie rzeczywistym, więc oto, co zrobiłem:

- (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];
    }
}

Wadą jest oczywiście to, że wykonuje dwie czynności (metody) na suwak.

 4
Author: Nicolas Miari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 02:53:09