كيفية "نقل" المستجيب الأول من UIView إلى آخر؟
-
07-07-2019 - |
سؤال
لدي فئة فرعية UIView (CustomView
لأغراض هذا السؤال) التي لديها التعامل الخاص بها مع الجميع touches
الأحداث (بدأت، انتقلت، انتهت، ألغيت).لدي أيضا UIButton
هذا هو شقيق CustomView
الذي يتداخل معها.
على سبيل المثال، يبدو التسلسل الهرمي لطريقة العرض الخاصة بي كما يلي:
- UIView (عرض وحدة التحكم)
- CustomView مع الإطار (0، 0، 300، 300)
- زر واجهة المستخدم مع الإطار (0، 0، 100، 50)
أرغب في أن يلتقط CustomView أحداث اللمس بمجرد سحب المستخدم خارج UIButton.من خلال تسجيل التصحيح، يبدو أن UIControlEventTouchDragExit
الحدث هو الذي يجب اعتراضه (على الرغم من أنه لا يتم تشغيله حتى تكون اللمسة على بعد حوالي 100 بكسل من الزر، ولكن هذا ليس مهمًا لهذا السؤال).
من الناحية المثالية، عند تشغيل حدث خروج السحب، سيتوقف الزر عن تلقي أحداث نقل اللمس، وسيحصل CustomView على touchesBegan
الحدث (حتى لو كنت بحاجة إلى تزييف حدث بنفسي بطريقة أو بأخرى)، وجميع أحداث اللمس المستقبلية (touchesMoved
, ، وما إلى ذلك) سيتم إرسالها إلى CustomView.
لقد قمت بتجربة ما يلي، ولم يكن له أي تأثير:
-(void)btnTouchDragExit:(id)sender
{
UIButton * btn = sender;
[btn resignFirstResponder];
[customView becomeFirstResponder];
}
أعتقد أن الكامنة UITouch
لا تتم إعادة توجيه الكائن (الذي يكون متسقًا عبر أحداث اللمس) للإشارة إلى CustomView.كيف يمكنني تحقيق التأثير المطلوب؟
المحلول
فقط استخدم hitTest:withEvent:لمعرفة طريقة العرض "التي ينبغي" أن تستقبل الحدث، ثم قم بإعادة توجيه الحدث إلى طريقة العرض المناسبة.قد يتعين عليك القيام ببعض الرقص لاعتراض الأحداث قبل أن تنتقل إلى الزر، ولكن هذا هو ما حدث: hitTest:withEvent:تم صنعه من أجل.
نصائح أخرى
عليك أن تتجاوز canBecomeFirstResponder
للعودة نعم خلاف ذلك becomeFirstResponder
لا يفعل شيئا.لقد تم ذلك بالفعل UIControl
ق، ولكن ليس على UIView
س