سؤال

أحتاج إلى التقاط إيماءات مضغوطين مختلفين باستخدام UISwipeGestureRecognizer(علي سبيل المثال، UISwipeGestureRecognizerDirectionRight و UISwipeGestureRecognizerDirectionLeft). عندما أضيف اثنين من المعرفة المختلفة مع AddgerUreCognizer الطريقة ، آخر مرة أضيفت أعمال التعرف. لقد قرأت أنني بحاجة للتنفيذ GesturereCognizer: يجب أن يدرك ذلك طريقة UIGestureRecognizerDelegate البروتوكول ، ولكن لا شيء يعمل.

هل يمكن لأي شخص أن يساعد في مثال بسيط على اصطياد اثنين أو أكثر من الإيماءات؟ شكرًا!

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

المحلول

كان الأمر سهلاً حقًا:

في البداية يجب أن ننشئ فئة ، وهذا ينفذ UIGestureRecognizerDelegate بروتوكول:

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate>

@implementation MyGestureDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    return YES;
}

واستخدمها مثل هذا:


    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
    [self.view addGestureRecognizer:swipeGestureLeft];
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [swipeGestureLeft release];

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleSwipeGesture:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGesture];

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init];

    [swipeGesture setDelegate:deleg];
    [swipeGesture release];

نصائح أخرى

الجواب: "أم ، نظرة سريعة على الوثائق ..." من فينيكس لن تعمل على الإطلاق!

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

الاتجاهات المسموح بها للانتقاد

sender.direction

سوف يعيد ببساطة القناع الذي حددته في البداية وفي مثاله ، لن يحل أبدًا إلى اتجاه واحد!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

الإضافة ، بالنسبة لمعظم الحالات ، لا تحتاج إلى:

  • إعداد مندوب
  • السماح بالتعرف على الإيماءات المتزامنة (ما لم تكن تريد الضربات المتزامنة ؛ ليس من المحتمل)
  • أرسل المعرف إلى المحدد

ما يلي يعمل بالنسبة لي:

   UISwipeGestureRecognizer* swipe;

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionLeft;
   [view addGestureRecognizer:swipe];

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
   [view addGestureRecognizer:swipe];

أم ، إن نظرة سريعة على الوثائق قد تكشف أنك تقوم بعمل أكثر مما تحتاج إلى:

"الاتجاه الاتجاهات المسموح بها للانتقاد.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

مناقشة يمكنك تحديد اتجاهات متعددة من خلال تحديد المضاعف UISwipeGestureRecognizerDirection الثوابت باستخدام bitwise-or المعاملات. الاتجاه الافتراضي هو UISwipeGestureRecognizerDirectionRight."

وهذا يعني ، بدلاً من استخدام اثنين من uiswipegesturereCognizers ، يمكنك فقط القيام بما يلي:

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleSwipeGesture:)];

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

وفي طريقة العمل الخاصة بك:

  -(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
     {
     if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {

         //do left action

     } else {

         //do right action

     }
}

أبسط بكثير ، وأقل عرضة للصراع.

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

من المفيد جدًا قراءة كيفية عملها من أجل فهم كيفية استخدامها.

أتمنى أن يساعدك هذا.

بفضل اقتراح user294890 ، كنت ناجحًا من خلال العودة بنعم من القائمة UIGestureRecognizerDelegate أساليب.

ومع ذلك ، فقد وجدت أنه لن ينجح عندما كنت أضيف GesturereCognizer قبل تحميل عرض الويب. ومع ذلك ، فقد نجحت عندما أضفت GesturerEcognizer إلى WebView في طريقة WebView Pelegate:

- (void)webViewDidFinishLoad:(UIWebView *)webView.

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