سؤال

لدي فئة فرعية 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س

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