سؤال

أود الجمع بين uilongpressUrgeReCognizer و uipangesturerecognizer.

يجب أن يبدأ uipangesturereCognizer بصحافة طويلة. هل هناك طريقة بسيطة للقيام بذلك؟ أو هل يجب علي حقًا كتابة معرف الإيماءات الخاص بي؟

لم أكن مثل على الشاشة الرئيسية. يمكنك الضغط على أيقونة وبعد مرور بعض الوقت تبدأ الرموز بالتذبذب. بعد ذلك دون إطلاق إصبعي من الشاشة ، يمكنني البدء في سحب الرمز أسفل إصبعي.

هل كانت مفيدة؟

المحلول 3

لقد وجدت حلًا: طريقة uigesturereCognizerDelegate تفعل بالضبط ما بحثت عنه:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

نصائح أخرى

في الواقع ، ليس عليك الجمع بين معرفات الإيماءات - يمكنك القيام بذلك فقط مع UilongPressUrgeReCognizer ... أنت تدخل StateBegan بمجرد أن بقيت لمسة (ES) ضمن "السماح" من أجل "الحد الأدنى". يمكنك البقاء في Longpressesture المستمر طالما أنك لا ترفع أي من أصابعك - حتى تتمكن من البدء في تحريك أصابعك وتتبع الحركة من خلال StateChanged.

إيماءات الضغط الطويلة مستمرة. تبدأ هذه الإيماءة (UigestUrureRecognizerStateBegan) عندما يتم الضغط على عدد الأصابع المسموح بها (NumberOuchesSequired) للفترة المحددة (الحد الأدنى) ولا تتحرك اللمسات إلى ما وراء النطاق المسموح به للحركة (المسموح). ينتقل معرف التعرف على الإيماءات إلى حالة التغيير كلما تحرك الإصبع ، وينتهي (UIGESTURERECONIZERSESTATENTEDED) عند رفع أي من الأصابع.

كان لدي القليل من الوقت الصعب لهذه المشكلة. الإجابة المقبولة لم تكن كافية. بغض النظر عن ما أضعه في هذه الطريقة ، سيتم استدعاء المعالجات Longpress. كان الحل الذي وجدته على النحو التالي:

  1. تأكد من تعيين مندوبي التعرف على الإيماءات على نفس الفصل (في حالتي الذاتية) وتأكد من أن فئة المفوض UIGestureRecognizerDelegate.
  2. أضف طريقة المندوب التالية إلى فصلك (وفقًا للإجابة أعلاه):

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
         return YES;
    }
    
  3. أضف طريقة المندوب التالية إلى فصلك:

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
         if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) {
              return NO;
         }
         return YES;
    }
    
  4. ثم أضف إما خاصية أو إيفار والتي سيتم تتبعها إذا كان ينبغي السماح للبدء بالبدء (انظر الطريقة أعلاه). في حالتي BOOL shouldAllowPan.

  5. اضبط المنحة على NO في الخاص بك init أو viewDidLoad. داخل معالج Longpress الخاص بك ، قم بتعيين منطقي على YES. أفعل ذلك مثل هذا:

    - (void) longPressHandler: (UILongPressGestureRecognizer *) gesture {
    
         if(UIGestureRecognizerStateBegan == gesture.state) {
            shouldAllowPan = NO;
         }
    
         if(UIGestureRecognizerStateChanged == gesture.state) {
            shouldAllowPan = YES;
         }
    }
    
  6. داخل البانهيلر أقوم بفحص على المنحة:

    - (void)panHandler:(UIPanGestureRecognizer *)sender{
        if(shouldAllowPan) {
              // do your stuff
        }
    
  7. وأخيراً أعد ضبط المنسال داخل البانسلر:

    else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) {
        shouldAllowPan = NO;
    }
    
  8. ثم اذهب للاستيلاء على البيرة لتهنئة نفسك. ؛)

نهج آندي ب في سويفت ،

  1. أضف ال UigesturerEcognizerDelegate تفويض إلى الفصل

    class ViewController: UIViewController, UIGestureRecognizerDelegate
    
  2. إضافة متغير عضو

    var shouldAllowPan: Bool = false
    
  3. أضف الإيماءات وتحتاج إلى إضافة مندوب لفتة المقلاة إلى VC. هذا ضروري لإطلاق النار على وظائف anustrectizingImultImultStiveSureSureCognizer و GesturerEcognizershouldBegin

    // long press
    let longPressRec = UILongPressGestureRecognizer(target: self, action: "longPress:")
    yourView.addGestureRecognizer(longPressRec)
    
    // drag
    let panRec = UIPanGestureRecognizer(target: self, action: "draggedView:")
    panRec.delegate = self
    yourView.addGestureRecognizer(panRec)
    
  4. السماح الإيماءات المتزامنة

    func gestureRecognizer(UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
        // println("shouldRecognizeSimultaneouslyWithGestureRecognizer");
        return true
    }
    
    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
         // We only allow the (drag) gesture to continue if it is within a long press
         if((gestureRecognizer is UIPanGestureRecognizer) && (shouldAllowPan == false)) {
             return false;
         }
         return true;
    }
    
  5. داخل معالج الصحافة الطويل:

    func longPress(sender: UILongPressGestureRecognizer) {
    
        if(sender.state == .Began) {
            // handle the long press
        }
        else if(sender.state == .Changed){
            shouldAllowPan = true
    
        }
        else if (sender.state == .Ended) {
            shouldAllowPan = false
        }
    } 
    

اقرأ قسم "الملاحظات الفرعية" في مرجع فئة uigesturereCognizer من Apple على:

https://developer.apple.com/library/prerlease/tvos/documentation/uikit/reference/uigesturerecognizer_class/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top