ios - مشكلة - كيف اطلع زر الهوم على الشاشه




iPhone: كيف للكشف عن نهاية السحب المنزلق؟ (10)

كيف يمكن اكتشاف الحدث عندما ينتهي المستخدم من سحب مؤشر المنزلق؟


سويفت 3.1

في بعض الأحيان ، ستحتاج إلى إطلاق أحداث السحب في شريط التمرير باستمرار ، ولكن يتوفر لديك خيار تنفيذ تعليمات برمجية مختلفة اعتمادًا على ما إذا كان شريط التمرير لا يزال قيد السحب أم أنه انتهى للتو من سحبه.

للقيام بذلك ، توسعت على جواب آندي أعلاه الذي يجعل استخدام خاصية isTracking في شريط التمرير. كنت بحاجة لتسجيل حالتين: sliderHasFinishedTracking و sliderLastStoredValue .

شفرتي بشكل صحيح:

  • لا يطلق النار على عمل عند بدء السحب

  • يشعل الإجراء إذا قام المستخدم فقط بضغط شريط التمرير بنقرة واحدة (بمعنى أن isTracking 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 و سويفت 3

  1. أضف هدفًا إلى أحداث touchUpOutside و touchUpOutside . يمكنك القيام بذلك إما برمجيًا أو من لوحة العمل. هذه هي الطريقة التي تقوم بها بشكل برمجي

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
  2. اكتب الدالة الخاصة بك للتعامل مع نهاية السحب المنزلق

    func sliderDidEndSliding() {
        print("end sliding")
    }


إذا لم تكن بحاجة إلى أي بيانات في المنتصف ، يجب عليك ببساطة تعيين:

[mySlider setContinuous: NO];

بهذه الطريقة ستتلقى valueChanged event فقط عندما يتوقف المستخدم عن تحريك شريط التمرير.


ربما يجب عليك إضافة هدف لأحداث UIControlEventTouchUpInside 、 UIControlEventTouchUpOutside 、 UIControlEventTouchCancel.

التقيت بنفس المشكلة من قبل ، لأنني لا أضيف هدفًا لحدث UIControlEventTouchCancel .


سويفت 3 إجابة

واجهت نفس المشكلة ، وفي النهاية حصلت على هذا للعمل ، لذلك ربما يساعد شخص ما. قم بتوصيل your_Slider ب "القيمة التي تم تغييرها" في لوحة العمل وعندما تم تحريك مربع التمرير "Slider Touched" تصرف وعندما ترك "Slider Released".

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

قم بتوصيل Touch Up Inside Value Changed


كان لدي مشكلة مماثلة في الآونة الأخيرة. هذا ما فعلته في سويفت:

    theSlider.continuous = false;

يقرأ الرمز الذي يحمل هذه القيمة المستمرة:

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

يبدو أن الافتراضي هو نعم (صحيح). تعيينه إلى false يفعل الشيء الذي تريده.


يمكنك إضافة إجراء يأخذ معلمتين ومرسل وحدث ، من أجل UIControlEventValueChanged:

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

ثم تحقق من مرحلة كائن اللمس في معالجك:

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

سويفت 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
        }
    }
}

ملاحظة في Interface Builder عند إضافة إجراء ، يكون لديك أيضًا خيار إضافة كل من معاملات المرسل والحدث إلى الإجراء.


يمكنك استخدام:

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

لاكتشاف متى تحدث أحداث touchDown و touchUp في UISlider





uislider