English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

حل مشكلة عدم الاستجابة للنقر على UIButton في iOS

مقدمة

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

أسباب عدم استجابة الزر

1. تم إضافة الزر إلى عناصر الظاهرية الأمامية التي لم تفتح التفاعل، مثل UIImageView، يجب فتح تفاعل العنصر الأمامي view.userInteractionEnabled = YES

عند إعدادها إلى YES يمكن حل المشكلة

2. يتم تغطية الزر نفسه، عند النقر، لا يتم النقر على الزر نفسه، بل على طبقة View فوقه، وبالتالي لن يتم الاستجابة.

هناك طريقة لرؤية طبقات اللوحة، ويمكنك رؤية العناصر UI الحالية للوحة التشغيل الحالية بالنقر على الزر في الصندوق الأحمر، يمكنك رؤية ما إذا كانت هناك view تعيق الزر

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

ماذا تفعل إذا واجهت هذه المشكلة، استمر في القراءة

حل مشكلة الخروج من منطقة اللمس

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

حل المشكلة

هناك طريقتان، ويتم تنفيذ هاتين الطريقتين كلما حدثت عملية لمس

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

أعاد طريقة -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

هذه هي طريقة في View، والخطوات في معالجة العملية كالتالي

  • أولاً، يتم استدعاء طريقة pointInside:withEvent: للعنصر الحالي لتحديد ما إذا كان نقطة اللمس داخل العنصر الحالي.
  • إذا كان العنصر يعود بالفراغ، فإن طريقة hitTest:withEvent: تعود بنيل;
  • إذا كان العنصر يعود بنعم، فإنه يرسل رسالة hitTest:withEvent: إلى جميع العناصر الفرعية للعنصر الحالي (subviews)، ترتيب استكشاف العناصر الفرعية من الأعلى إلى الأسفل، أي من نهاية مجموعة subviews، حتى العنصر الفرعي يعود بالفراغ أو استكشاف جميع العناصر الفرعية.
  • إذا كان العنصر الفرعي يعود بالفراغ لأول مرة، فإن طريقة hitTest:withEvent: تعود بهذا العنصر، ينتهي المعالجة.
  • إذا كانت جميع العناصر الفرعية تعود بنعم، فإن طريقة hitTest:withEvent: تعود بنفسها (self).
  • في النهاية، يتم معالجة هذه أحداث اللمس بواسطة عائلة النافذة التي تعود من method hitTest:withEvent:.

لذا يمكننا التعامل مع ذلك عند إرجاع nil، لأنه في هذه اللحظة، الزر خارج View الأب

//إرجاع view ليتفاعل مع الحدث
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
 UIView *view = [super hitTest:point withEvent:event];
 if (view == nil){
  //تحويل الإحداثيات
  CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self];
  //تحقق مما إذا كان النقرة في منطقة الزر
  if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){
   //إرجاع الزر
   return _testBtn;
  }
 }
 return view;
}

في هذه اللحظة، النقر على الزر خارج منطقة يمكن أن يكون له تأثير

الخلاصة

ما تم ذكره أعلاه هو حل مشكلة عدم الاستجابة للنقر في UIButton في iOS الذي قدمته لك المحرر، آمل أن يكون هذا مفيداً لك، إذا كان لديك أي استفسارات، يرجى ترك تعليق، وسأقوم بالرد عليك في أقرب وقت. شكراً جزيلاً لدعمكم لتعليمات النداء!

بيان: محتوى هذا المقال تم جمعه من الإنترنت، يملك حقوق الطبع والنشر أصحاب المشاريع، تم إدراج المحتوى من قبل مستخدمي الإنترنت بشكل تلقائي، ويملك الموقع غير حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية مرتبطة بذلك. إذا اكتشفت أي محتوى يشتبه في انتهاك حقوق النسخ، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) للإبلاغ، وقدم الدليل أدله، إذا تم التحقق من صحة المعلومات، فإن الموقع سيقوم بإزالة المحتوى المشبوه فوراً.

مفضل لك