سؤال

لديّ Uibultton الذي يحتوي على iBacte بالإضافة إلى uitapgestoreRecognizer للكشف عن الصنابير المزدوجة.

في الوقت الحالي ، يبدو أن ibacte يحظر معرف التعرف. هل هناك طريقة لإيقاف هذا أو هل تعمل uitapgesturereCognizer حتى على الأزرار؟ إذا كان الأمر كذلك ، فلن يكون من الأفضل مجرد إضافة المعرفين وإزالة Ibactions؟

تعديل

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[A1 addGestureRecognizer:doubleTap];
[A2 addGestureRecognizer:doubleTap];
[B1 addGestureRecognizer:doubleTap];
هل كانت مفيدة؟

المحلول

يبدو أنك تحاول إرفاق معرف الإيماءات بأزرار متعددة. لا يمكن إرفاق معرف الإيماءات إلا بعرض واحد في كل مرة. لذلك في حالتك ، ربما يستجيب الزر الأخير الذي تقوم بتوصيله إلى (الزر B1) على النقر المزدوج ولكن A1 و A2 لا.

إنشاء معرف منفصل لكل زر.
لكن يمكن للمعرفة الثلاثة أن يطلقوا نفس طريقة الإجراء (handleDoubleTap:).

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

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

بعد ذلك ، في IB ، ل كل زر ، قم بربط حدث "Touch Down" buttonPressed:. أو للقيام بذلك برمجيا:

[button1 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button2 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button3 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];

بعد ذلك ، في IB ، ل كل زر ، ربط "اللمس في الداخل" و أحداث "لمس خارج" مع buttonReleased:. أو للقيام بذلك برمجيا:

[button1 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button2 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button3 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];

بعد ذلك ، أضف Ivars لتتبع عدد أو الأزرار التي يتم الضغط عليها:

@property (nonatomic) int numberOfButtonsBeingTouched;
@property (strong, nonatomic) NSMutableSet *buttonsBeingTouched; //alloc + init in viewDidLoad or similar

إذا كنت تهتم فقط عدد الأزرار التي يتم الضغط عليها ، فلن تحتاج إلى NSMutableSet.

أخيرًا ، أضف أساليب ButtonPressed و ButtonRexed:

- (IBAction)buttonPressed:(UIButton *)button {
    self.numberOfButtonsBeingTouched++;
    [self.buttonsBeingTouched addObject:button];
    //your logic here (if (self.numberOfButtonsBeingTouched == 3) ...)
}

- (IBAction)buttonReleased:(UIButton *)button {
    self.numberOfButtonsBeingTouched--;
    [self.buttonsBeingTouched removeObject:button];
    //your logic (if any needed) here
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top