webentwicklung-frage-antwort-db.com.de

iPhone: Wie erkenne ich das Ende des Schiebereglers?

Wie erkennt man das Ereignis, wenn der Benutzer das Ziehen eines Schiebereglers beendet hat?

79
DroidHeaven

Wenn Sie zwischen dem Ziehen keine Daten benötigen, sollten Sie einfach Folgendes festlegen:

[mySlider setContinuous: NO];

Auf diese Weise erhalten Sie das Ereignis valueChanged nur, wenn der Benutzer den Schieberegler nicht mehr bewegt.

147
Rok Jarc

Sie können eine Aktion hinzufügen, die zwei Parameter, Absender und ein Ereignis für UIControlEventValueChanged übernimmt:

[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]

Überprüfen Sie dann die Phase des Touch-Objekts in Ihrem Handler:

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

Schnelle 4 & 5

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
        }
    }
}

Beachten Sie beim Hinzufügen einer Aktion im Interface Builder, dass Sie auch die Option haben, der Aktion sowohl Absender- als auch Ereignisparameter hinzuzufügen.

81
pinch

Ich verwende die Benachrichtigungen "Nachbessern innen" und "Nachbessern außen".

Interface Builder:

Verbinden Sie beide Benachrichtigungen im Interface Builder mit Ihrer Empfangsmethode. Die Methode könnte so aussehen:

- (IBAction)lengthSliderDidEndSliding:(id)sender {
    NSLog(@"Slider did end sliding... Do your stuff here");
}

im Code:

Wenn Sie es programmgesteuert verkabeln möchten, haben Sie so etwas in Ihrem viewWillAppear (oder wo immer es Ihnen passt) -Aufruf:

[_mySlider addTarget:self
              action:@selector(sliderDidEndSliding:) 
    forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];

Die Empfangsmethode würde folgendermaßen aussehen:

- (void)sliderDidEndSliding:(NSNotification *)notification {
     NSLog(@"Slider did end sliding... Do your stuff here");
}
69
thomas

Da UISlider eine Unterklasse von UIControl ist, können Sie ein Ziel und eine Aktion für dessen UIControlEventTouchUpInside festlegen.

Wenn Sie es im Code tun möchten, sieht es so aus:

[self.slider addTarget:self action:@selector(dragEndedForSlider:)
    forControlEvents:UIControlEventTouchUpInside];

Das wird Ihnen eine dragEndedForSlider: Nachricht senden, wenn die Berührung endet.

Wenn Sie dies in Ihrer Schreibfeder tun möchten, können Sie bei gedrückter Ctrl-Taste auf den Schieberegler klicken, um das Verbindungsmenü aufzurufen, und dann vom Sockel „Touch Up Inside“ auf das Zielobjekt ziehen.

Sie sollten auch ein Ziel und eine Aktion für UIControlEventTouchUpOutside und für UIControlEventTouchCancel hinzufügen.

16
rob mayoff

Swift 5 und Swift 4

  1. Ziel für touchUpInside und touchUpOutside Ereignisse hinzufügen. Sie können dies entweder programmgesteuert oder über das Storyboard tun. So machen Sie es programmatisch

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
    
  2. Schreiben Sie Ihre Funktion, um das Ende des Schiebereglers zu behandeln

    func sliderDidEndSliding() {
        print("end sliding")
    }
    
13
Guy Daher

Sie können verwenden:

- (void)addTarget:(id)target action:(SEL)action 
                   forControlEvents:(UIControlEvents)controlEvents  

um zu erkennen, wann die Ereignisse touchDown und touchUp in UISlider auftreten

10
Mudit Bajpai

Ich denke, Sie brauchen das Kontrollereignis UIControlEventTouchUpInside .

7
scorpiozj

Swift 3.1

Manchmal möchten Sie, dass die Ziehereignisse des Schiebereglers kontinuierlich ausgelöst werden, haben jedoch die Möglichkeit, unterschiedlichen Code auszuführen, je nachdem, ob der Schieberegler noch gezogen wird oder gerade fertig gezogen wurde.

Zu diesem Zweck habe ich Andys Antwort weiter oben erweitert, die die isTracking -Eigenschaft des Schiebereglers verwendet. Ich musste zwei Zustände aufzeichnen: sliderHasFinishedTracking und sliderLastStoredValue.

Mein Code richtig:

  • löst beim Starten des Ziehens keine Aktion aus

  • löst die Aktion aus, wenn der Benutzer den Schieberegler nur mit einem einzigen Antippen bewegt (dh, isTracking bleibt false)


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
  }
}
4
Jamie Birch

Verbinden Touch Up Inside und Value Changed

enter image description here

4
Abo3atef

In Swift 4 können Sie diese Funktion verwenden

1 Erster Schritt: - Hinzufügen des Ziels im Schieberegler

self.distanceSlider.addTarget(self, action: #selector(self.sliderDidEndSliding(notification:)), for: ([.touchUpInside,.touchUpOutside]))

2 Zweiter Schritt: - Erstellen Sie eine Funktion

@objc func sliderDidEndSliding(notification: NSNotification)
{
   print("Hello-->\(distanceSlider.value)")
}
4
pansora abhay

Schnelle 3 Antwort

Ich hatte das gleiche Problem und habe es irgendwann zum Laufen gebracht. Vielleicht hilft es jemandem. Verbinde your_Slider mit 'Value Changed' im Storyboard und wenn der Slider bewegt wird, wird "Slider Touched" aktiviert und wenn losgelassen "Slider Released".

@IBAction func your_Slider(_ sender: UISlider) {
    if (yourSlider.isTracking) {
        print("Slider Touched")
    } else {
        print("Slider Released")
    }
}
4
Andy

Möglicherweise sollten Sie ein Ziel für UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel-Ereignisse hinzufügen.

Ich bin auf dasselbe Problem gestoßen, da ich kein Ziel für das IControlEventTouchCancel -Ereignis hinzufüge.

1
zhuoming

Ich hatte vor kurzem ein ähnliches Problem. Folgendes habe ich in Swift gemacht:

    theSlider.continuous = false;

Der Code, der diesen fortlaufenden Wert enthält, lautet:

public var continuous: Bool // if set, value change events are generated
    // any time the value changes due to dragging. default = YES

Die Standardeinstellung scheint JA (wahr) zu sein. Wenn Sie den Wert auf false setzen, wird das gewünschte Ergebnis erzielt.

1
Evdzhan Mustafa

Versuchen Sie es so

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);
}
0
Raj Subbiah