الجمع بين uilongpressureStureserCognizer و uipangesturerecognizer
سؤال
أود الجمع بين uilongpressUrgeReCognizer و uipangesturerecognizer.
يجب أن يبدأ uipangesturereCognizer بصحافة طويلة. هل هناك طريقة بسيطة للقيام بذلك؟ أو هل يجب علي حقًا كتابة معرف الإيماءات الخاص بي؟
لم أكن مثل على الشاشة الرئيسية. يمكنك الضغط على أيقونة وبعد مرور بعض الوقت تبدأ الرموز بالتذبذب. بعد ذلك دون إطلاق إصبعي من الشاشة ، يمكنني البدء في سحب الرمز أسفل إصبعي.
المحلول 3
لقد وجدت حلًا: طريقة uigesturereCognizerDelegate تفعل بالضبط ما بحثت عنه:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
نصائح أخرى
في الواقع ، ليس عليك الجمع بين معرفات الإيماءات - يمكنك القيام بذلك فقط مع UilongPressUrgeReCognizer ... أنت تدخل StateBegan بمجرد أن بقيت لمسة (ES) ضمن "السماح" من أجل "الحد الأدنى". يمكنك البقاء في Longpressesture المستمر طالما أنك لا ترفع أي من أصابعك - حتى تتمكن من البدء في تحريك أصابعك وتتبع الحركة من خلال StateChanged.
إيماءات الضغط الطويلة مستمرة. تبدأ هذه الإيماءة (UigestUrureRecognizerStateBegan) عندما يتم الضغط على عدد الأصابع المسموح بها (NumberOuchesSequired) للفترة المحددة (الحد الأدنى) ولا تتحرك اللمسات إلى ما وراء النطاق المسموح به للحركة (المسموح). ينتقل معرف التعرف على الإيماءات إلى حالة التغيير كلما تحرك الإصبع ، وينتهي (UIGESTURERECONIZERSESTATENTEDED) عند رفع أي من الأصابع.
كان لدي القليل من الوقت الصعب لهذه المشكلة. الإجابة المقبولة لم تكن كافية. بغض النظر عن ما أضعه في هذه الطريقة ، سيتم استدعاء المعالجات Longpress. كان الحل الذي وجدته على النحو التالي:
- تأكد من تعيين مندوبي التعرف على الإيماءات على نفس الفصل (في حالتي الذاتية) وتأكد من أن فئة المفوض
UIGestureRecognizerDelegate
. أضف طريقة المندوب التالية إلى فصلك (وفقًا للإجابة أعلاه):
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }
أضف طريقة المندوب التالية إلى فصلك:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ! shouldAllowPan) { return NO; } return YES; }
ثم أضف إما خاصية أو إيفار والتي سيتم تتبعها إذا كان ينبغي السماح للبدء بالبدء (انظر الطريقة أعلاه). في حالتي
BOOL shouldAllowPan
.اضبط المنحة على
NO
في الخاص بكinit
أوviewDidLoad
. داخل معالج Longpress الخاص بك ، قم بتعيين منطقي علىYES
. أفعل ذلك مثل هذا:- (void) longPressHandler: (UILongPressGestureRecognizer *) gesture { if(UIGestureRecognizerStateBegan == gesture.state) { shouldAllowPan = NO; } if(UIGestureRecognizerStateChanged == gesture.state) { shouldAllowPan = YES; } }
داخل البانهيلر أقوم بفحص على المنحة:
- (void)panHandler:(UIPanGestureRecognizer *)sender{ if(shouldAllowPan) { // do your stuff }
وأخيراً أعد ضبط المنسال داخل البانسلر:
else if(sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled) { shouldAllowPan = NO; }
ثم اذهب للاستيلاء على البيرة لتهنئة نفسك. ؛)
نهج آندي ب في سويفت ،
أضف ال UigesturerEcognizerDelegate تفويض إلى الفصل
class ViewController: UIViewController, UIGestureRecognizerDelegate
إضافة متغير عضو
var shouldAllowPan: Bool = false
أضف الإيماءات وتحتاج إلى إضافة مندوب لفتة المقلاة إلى 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)
السماح الإيماءات المتزامنة
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; }
داخل معالج الصحافة الطويل:
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 على: