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.
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.
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
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ę.
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.
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