2009-10-07 13 views

उत्तर

10

UIWindow में sendEvent: नामक एक आसान पकड़-सभी विधि है जो ईवेंट-हैंडलिंग पाइपलाइन की शुरुआत के करीब हर घटना को देखती है। यदि आप कोई गैर-मानक अतिरिक्त ईवेंट हैंडलिंग करना चाहते हैं, तो इसे रखने के लिए यह एक अच्छी जगह है। कुछ ऐसा:

- (void)sendEvent:(UIEvent *)event { 
    if ([self eventIsNoteworthy:event]) [self extraEventHandling:event]; 
    [super sendEvent:event]; // Apple says you must always call this! 
} 

डॉक्स: UIWindow class reference | iOS event delivery docs

This blog post भी कहा गया है कि कैसे hitTest:withEvent: ओवरराइड करने के लिए कुछ घटनाओं को पकड़ने के लिए इससे पहले कि वे दृश्य पदानुक्रम में लक्ष्य पत्ती subview करने के लिए बाध्य कर रहे हैं। यदि आप चाहें तो UIWindow ऑब्जेक्ट पर आप उस विधि को ओवरराइड भी कर सकते हैं।

3

UIWindow UIView का एक उपवर्ग है, तो आप बस इसे उपवर्ग और इसका इस्तेमाल आप में AppDelegate:

self.window = [[MyWindow alloc] initWithFrame:CGRectMake(0,0,320,480)]; // Sorry for hard-coded frame size! 

और में MyWindow आप -hitTest ओवरराइड: withEvent: और/या -pointInside: withEvent:

0

UIWindowUIResponder का उप-वर्ग है, जिसमें स्पर्श ईवेंट को संभालने के लिए एपीआई हैं (उदाहरण के लिए, touchesBegan:withEvent:)। इसके बाद UIWindow को उपclass करना संभव है, स्पर्श ईवेंट हैंडलिंग API को ओवरराइड करें, और स्पर्श ईवेंट को स्वयं प्रबंधित करें।

+0

UIWindow कुछ UITableView के समान subviews है आखिरी बार खिड़की को संभालने का मौका मिलने से पहले सभी स्पर्श घटनाओं को पकड़ लेता है। तो स्पर्श करता है बीज: साथ: खिड़की के तरीकों का समूह कभी भी इस परिस्थितियों में नहीं बुलाया जाता है। इस मामले में sendEvent: UIWindow तालिका दृश्य देखने से पहले स्पर्श घटनाओं को संभालने का एकमात्र तरीका है। –

4

आपको अपनी खुद की कक्षा के साथ UIWindow उपclass करना होगा और sendEvent: विधि ओवरराइड करना होगा। लेकिन याद रखें कि विधि अन्य प्रकार की घटनाओं को प्राप्त करती है - न केवल स्पर्श करती है ताकि आपको ईवेंट प्रकार (event.type == UIEventTypeTouches) की जांच करनी पड़े। चूंकि आप स्पर्शों का सेट प्राप्त करते हैं, इसलिए आप यह जांचना चाहेंगे कि कौन से लोग अभी शुरू हुए हैं, जो समाप्त हो गए हैं, स्थानांतरित हो गए हैं। ऐसा करने के लिए आपको सभी टच के माध्यम से फिर से भरना होगा और प्रत्येक UITouch की phase संपत्ति की जांच करनी होगी।

@implementation TouchWindow 

- (void)sendEvent:(UIEvent *)event { 

    if (event.type == UIEventTypeTouches) { 
     for(UITouch * t in [event allTouches]) { 
      if(t.phase == UITouchPhaseBegan) { 
       /* 
       Paste your code here. 
       Inform objects that some touch has occurred. 
       It's your choice if you want to perform method/selector directly, 
       use protocols/delegates, notification center or sth else. 
       */ 
      } 
     } 
    } 

    [super sendEvent:event]; 
} 

@end
पाठ्यक्रम TouchWindow के

UIWindow

@interface TouchWindow : UIWindow 
@end 

के उपवर्ग है और आप शायद XCode में अपने .xib फ़ाइल में उस वर्ग बदलने के लिए होगा

संबंधित मुद्दे