ios - eliminar - me olvide el codigo de restricciones del iphone
iPhone: ¿Cómo detectar el final del arrastre deslizante? (14)
Swift 3.1
A veces, querrá que los eventos de arrastre del control deslizante se activen de forma continua, pero tiene la opción de ejecutar un código diferente dependiendo de si el control deslizante aún se está arrastrando o si acaba de ser arrastrado.
Para hacer esto, isTracking
la respuesta de Andy que hace uso de la propiedad isTracking
del control deslizante. Necesitaba registrar dos estados: sliderHasFinishedTracking
y sliderLastStoredValue
.
Mi código correctamente:
no dispara una acción al comenzar arrastrar
dispara la acción si el usuario solo empuja el control deslizante con un solo toque (lo que significa que el
isTracking
sigue siendofalse
)
class SliderExample: UIViewController {
var slider: UISlider = UISlider()
var sliderHasFinishedTracking: Bool = true
var sliderLastStoredValue: Float!
override func loadView() {
super.loadView()
slider.minimumValue = 100.0
slider.maximumValue = 200.0
slider.isContinuous = true
slider.value = 100.0
self.sliderLastStoredValue = slider.value
slider.addTarget(self, action: #selector(respondToSlideEvents), for: .valueChanged)
// add your slider to the view however you like
}
func respondToSlideEvents(sender: UISlider) {
let currentValue: Float = Float(sender.value)
print("Event fired. Current value for slider: /(currentValue)%.")
if(slider.isTracking) {
self.sliderHasFinishedTracking = false
print("Action while the slider is being dragged ⏳")
} else {
if(self.sliderHasFinishedTracking && currentValue == self.sliderLastStoredValue){
print("Slider has finished tracking and its value hasn''t changed, " +
"yet event was fired anyway. 🤷") // No need to take action.
} else {
self.sliderHasFinishedTracking = true
print("Action upon slider drag/tap finishing ⌛️")
}
}
self.sliderLastStoredValue = currentValue
}
}
¿Cómo detectar el evento cuando el usuario ha finalizado el arrastre de un puntero deslizante?
Swift 4 y Swift 3
Agregar destino para los eventos
touchUpInside
ytouchUpOutside
. Puedes hacerlo programáticamente o desde el guión gráfico. Así es como lo haces programáticamente.slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
Escriba su función para manejar el final del arrastre del deslizador
func sliderDidEndSliding() { print("end sliding") }
Creo que necesitas el evento de control UIControlEventTouchUpInside
.
Dado que UISlider
es una subclase de UIControl
, puede establecer un destino y una acción para su UIControlEventTouchUpInside
.
Si quieres hacerlo en código, se ve así:
[self.slider addTarget:self action:@selector(dragEndedForSlider:)
forControlEvents:UIControlEventTouchUpInside];
Eso te enviará un mensaje dragEndedForSlider:
cuando finalice el toque.
Si desea hacerlo en su plumilla, puede controlar y hacer clic en su control deslizante para obtener su menú de conexiones, y luego arrastrar desde el socket "Retocar hacia adentro" al objeto de destino.
También debe agregar un objetivo y una acción para UIControlEventTouchUpOutside
y para UIControlEventTouchCancel
.
En Swift 4 puedes usar esta función.
1 primer paso: - Agregar el objetivo en el control deslizante
self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))
2 Segundo paso: - Crear una función
@objc func sliderDidEndSliding(notification: NSNotification)
{
print("Hello-->/(distanceSlider.value)")
}
Prueba asi
customSlider.minimumValue = 0.0;
customSlider.maximumValue = 10.0;
[customSlider addTarget:self action:@selector(changeSlider:) forControlEvents:UIControlEventValueChanged];
-(void)changeSlider:(id)sender{
UISlider *slider=(UISlider *)sender;
float sliderValue=(float)(slider.value );
NSLog(@"sliderValue = %f",sliderValue);
}
Puede agregar una acción que toma dos parámetros, un remitente y un evento, para UIControlEventValueChanged:
[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]
Luego verifique la fase del objeto táctil en su controlador:
- (void)onSliderValChanged:(UISlider*)slider forEvent:(UIEvent*)event {
UITouch *touchEvent = [[event allTouches] anyObject];
switch (touchEvent.phase) {
case UITouchPhaseBegan:
// handle drag began
break;
case UITouchPhaseMoved:
// handle drag moved
break;
case UITouchPhaseEnded:
// handle drag ended
break;
default:
break;
}
}
Swift 4
slider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
@objc func onSliderValChanged(slider: UISlider, event: UIEvent) {
if let touchEvent = event.allTouches?.first {
switch touchEvent.phase {
case .began:
// handle drag began
case .moved:
// handle drag moved
case .ended:
// handle drag ended
default:
break
}
}
}
Tenga en cuenta que en Interface Builder, al agregar una acción, también tiene la opción de agregar parámetros de remitente y evento a la acción.
Puedes usar:
- (void)addTarget:(id)target action:(SEL)action
forControlEvents:(UIControlEvents)controlEvents
para detectar cuándo se producen los eventos touchDown y touchUp en UISlider
Si no necesita ningún dato entre arrastre, entonces simplemente debe establecer:
[mySlider setContinuous: NO];
De esta manera, recibirá el evento valueChanged
solo cuando el usuario deje de mover el control deslizante.
Swift 3 respuesta
Tuve el mismo problema y, finalmente, conseguí que esto funcionara, así que tal vez ayude a alguien. Conecta your_Slider a ''Value Changed'' en el guión gráfico y cuando el control deslizante movió "Slider Touched" y cuando se soltó "Slider Released".
@IBAction func your_Slider(_ sender: UISlider) {
if (yourSlider.isTracking) {
print("Slider Touched")
} else {
print("Slider Released")
}
}
Tal vez debería agregar target para los eventos UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel.
Me encontré con el mismo problema antes, porque no agrego destino para el evento UIControlEventTouchCancel .
Tuve un problema similar recientemente. Esto es lo que hice en Swift:
theSlider.continuous = false;
El código que contiene este valor continuo dice:
public var continuous: Bool // if set, value change events are generated
// any time the value changes due to dragging. default = YES
El valor predeterminado parece ser SÍ (verdadero). Poniéndolo en falso hace lo que quieres.
Utilizo las notificaciones "Retocar el interior" y "Retocar el exterior".
Generador de interfaz:
Conecte ambas notificaciones en el Generador de Interfaz a su método de recepción. El método podría verse así:
- (IBAction)lengthSliderDidEndSliding:(id)sender {
NSLog(@"Slider did end sliding... Do your stuff here");
}
En codigo:
Si quieres conectarlo programáticamente, tendrías algo como esto en tu punto de vista. Aparecerá (o donde sea que te convenga) la llamada:
[_mySlider addTarget:self
action:@selector(sliderDidEndSliding:)
forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
El método de recepción se vería así:
- (void)sliderDidEndSliding:(NSNotification *)notification {
NSLog(@"Slider did end sliding... Do your stuff here");
}