2009-02-10 16 views
20

मेरे पास UIImage है जो स्पर्श घटनाओं का जवाब देता है। मैं टच अनुक्रम को रद्द करना चाहता हूं, यानी, touchesMoved: पर आगे कॉल करें, यदि स्पर्श कुछ सीमाओं के बाहर जाता है। मैं उसे कैसे कर सकता हूँ?यूआईटीच घटनाओं के अनुक्रम को कैसे रद्द करें?

मुझे पता है कि touchesMoved: में मैं टच ऑब्जेक्ट के निर्देशांक का निरीक्षण कर सकता हूं और इसे अनदेखा कर सकता हूं, लेकिन मुझे नहीं पता कि अनुक्रम को पूरी तरह से कैसे रद्द किया जाए। मुझे Apple Developer UIResponder Reference में प्रलेखित कोई भी विधि दिखाई नहीं दे रही है जिसे मैं टच अनुक्रम रद्द करने के लिए कॉल कर सकता हूं।

उत्तर

6

यह समाधान एक सा kludgy हो सकता है, लेकिन आप को लागू कर सकता है और मैन्युअल रूप से

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 

मैं कुछ फेरबदल मैं एप्पल के iPhone sample code साइट पर moveme नमूना एप्लिकेशन पर किया था पर शिथिल इस समाधान आधारित कर रहा हूँ जहाँ मैं संशोधित फोन touchesMoved विधि इस तरह देखने के लिए:

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    if ([touch view] == placardView) 
     CGPoint location = [touch locationInView:self]; 
     placardView.center = location; 
     // I added the following line: 
     [self touchesCancelled:touches withEvent:event]; 
     return; 
} 
+1

धन्यवाद, जब मैं अपने मैक पर वापस आऊंगा तो मैं इसे आज़मा दूंगा। लेकिन क्या यह बाद के स्पर्श कार्यक्रमों को रद्द करने जा रहा है? ऐसा लगता है कि मैन्युअल कॉल को छूने के बाद, स्पर्श किए गए स्पर्श अभी भी सिस्टम द्वारा बुलाए जाएंगे। –

+0

MoveMe नमूना कोड की सीमाओं के भीतर यह स्पर्श रद्द कर देगा, लेकिन मेरा मानना ​​है कि आप सही हैं, स्पर्श करें अभी भी कॉल किया जाएगा। जितना अधिक मैं इसके बारे में सोचता हूं उतना ही कम लगता है स्पर्श करता है रद्द किया गया सही कॉल है। –

+0

यह काम नहीं करता है और घटनाओं के बाद "चाल" घटनाएं आती रहती हैं। – Andy

2

मैं एक ही समस्या हाल ही में सामना करना पड़ा और इसे हल करने के लिए एक मानक तरीका मिल गया है। स्पर्शों को वितरित करना बंद करने के लिए आप [[UIApplication sharedAplication] startIgnoringInteractionEvents] का उपयोग कर सकते हैं आपके पूरे ऐप में ईवेंट की गई घटनाएं। जब आपको दोबारा स्पर्श प्राप्त करने की आवश्यकता होती है तो उन्हें [[UIApplication sharedAplication] endIgnoringInteractionEvents] का उपयोग करके सक्षम करना सुनिश्चित करें।

3

आपको सुपर व्यू कार्यक्रम लेकिन अधिक महत्वपूर्ण से साफ बताने के लिए में [super touchesMoved:withEvent:] कॉल करने के लिए की जरूरत है, आप के लिए नहीं कॉल [super touchesCancelled:withEvent:] की जरूरत है।

यहाँ है कि मैं क्या एक सेल पर इस्तेमाल किया यह चयनित होने से रखने के लिए जब मैं एक कड़ी चोट का पता चला है:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!showingEdit) { 
     if (IS_FAR_ENOUGH_TO_BE_A_SWIPE) { 
      RESPOND_TO_SWIPE 
      showingEdit = YES; 
      [super touchesCancelled:touches withEvent:event]; 
     } else { 
      [super touchesMoved:touches withEvent:event]; 
     } 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if (!showingEdit) { 
     [super touchesEnded:touches withEvent:event]; 
    } 
} 
+1

यह मेरे लिए काम नहीं किया। – ma11hew28

2

मैं यह संभव है क्योंकि मैं इसे दस्तावेज नहीं दिख रहा है नहीं लगता है और इन समाधानों में से कोई भी काम।

-2

आप इसे देख सकते हैं, टच पॉइंट स्थान CGRect (यानी आपके चित्रदृश्य के आयत में हैं) या नहीं। अगर वे उस आय में नहीं हैं, तो स्पर्श रद्द कर दिया जाएगा।

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
CGPoint touchLocation = [touch locationInView:self.view]; 

    if (CGRectContainsPoint(myImageView, touchLocation)) 
    { 
     lastPoint = [touch locationInView: myImageView]; 
    } 

    NSLog(@"Last :%.2f - %.2f",lastPoint.x, lastPoint.y); 
    } 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint currentPoint; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchLocation = [touch locationInView:self.view]; 

    if (CGRectContainsPoint(myImageView.frame, touchLocation)) 
    { 
     currentPoint = [touch locationInView: myImageView]; 
    } 
} 
+1

वह कोड 'स्पर्शों को आगे की कॉल को रद्द नहीं करता है:'। यह सिर्फ उन्हें अनदेखा करता है। – ma11hew28

0

iOS5 पर साहचर्य वस्तुओं

का उपयोग करेंगे UITouch

-(void)setSentTouchesEnded:(BOOL)ended; 

सेब के क्रियान्वयन के आधार पर यह घटनाओं

ऐसा करने का एक और तरीका है भेजना बंद कर सकता है में एक निजी विधि प्रतीत हो रहा है

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([(NSNumber *)objc_getAssociatedObject(touch, &outKey) boolValue]) 
     return; 
    if (sometouchisoutsideofview) { 
     objc_setAssociatedObject(touch, &outKey, [NSNumber numberWithBool:YES], OBJC_ASSOCIATION_RETAIN); 
    } 
} 
3

UIImageView के उपयोगकर्ता इंटरैक्शन को अस्थायी रूप से सेट करने का प्रयास करें सक्षम संपत्ति को

0

मैं बस इस तरह कुछ हल करने की कोशिश कर रहा था, और पाया कि सूचीबद्ध समाधानों में से कोई भी मेरे लिए काम नहीं करता है। सबसे अच्छा मैं प्रबंधित कर सकता था अस्थायी रूप से छूने को अनदेखा कर रहा था, लेकिन फिर स्पर्श फिर से दर्ज होने पर वे फिर से शुरू हो गए।

अंत में इसे हल किया गया।

  1. एक बूलियन ध्वज "अक्षम"
  2. touchedMoved में, सबसे पहले देखें कि स्पर्श वांछित दृश्य के अंदर है कहा जाता है सेट करें। यदि ऐसा नहीं है, तो अक्षम ध्वज को YES पर सेट करें।
  3. अभी भी छुआ हुए में, अपनी कार्रवाई करने से पहले ध्वज की जांच करें। तो, इस बिंदु पर, यदि वे दृश्य के बाहर हैं तो कुछ भी नहीं होगा।
  4. स्पर्शों में, अक्षम ध्वज को NO पर सेट करें। इसलिए स्पर्श अनुक्रम प्रभावी रूप से तब तक रुक जाता है जब तक कि उपयोगकर्ता अपनी उंगली नहीं ले लेता।

मुझे लगता है कि यह तब तक आपके लिए काम करेगा जब तक कि आपके पास सचमुच स्पर्श अनुक्रम की आवश्यकता के लिए एक विशिष्ट कारण नहीं है।

+0

आप एक ही ध्वज का उपयोग करके यूआईसींट्रोल-शैली ट्रैकिंग भी कर सकते हैं। जो पूरे घटना अनुक्रम को एक बार में रद्द कर दिया गया था उससे अधिक प्राकृतिक लगता है। – Andy

1

"ब्रूट फोर्स" समाधान यह निर्भर करता है कि यह आपकी आवश्यकताओं के अनुरूप है: उन सबव्यूव को हटाएं और फिर से शुरू करें जो स्पर्श प्राप्त करते हैं या उन्हें जवाब देते हैं (निश्चित रूप से फ्रेम और सामग्री का ख्याल रखना)।

-1

आप यूआईटीच में श्रेणी बना सकते हैं। आप और जब आप नहीं के बराबर करने के लिए touch.view बदलने के लिए, उदाहरण के लिए, आप भेजने स्पर्श इवेंट

1

इस कोड को मदद मिलेगी के अंत अनुकरण कर सकते हैं

@property (nonatomic,strong,readwrite) UIView *view; 

घोषित करने के लिए कर सकते हैं। मैं touchesMoved: विधि में स्पर्श घटना को निष्क्रिय और मैं इसकी superview से देखने को दूर करने और यह सीधे वापस जोड़कर touchesCancelled: विधि

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    ....... 
    ....... 
    Your code 
    ....... 
    ....... 

    //Condition when you want to disable touch event 

    [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 

    ....... 
    ....... 
    Your code 
    ....... 
    ....... 
} 


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [[UIApplication sharedApplication] endIgnoringInteractionEvents]; 
} 
+0

यह मेरे लिए काम नहीं किया। – avance

1

मैं इस लक्ष्य को हासिल करने में स्पर्श घटना को सक्षम करने कर रहा हूँ।

[view retain]; 
UIView *sv = view.superview; 
[view removeFromSuperview]; 
[sv addSubview:view]; 
[view release]; 

यह प्रतिक्रियाकर्ता श्रृंखला को दृश्य में तोड़ देता है ताकि दृश्य पर कोई शेष स्पर्श प्राप्त नहीं किया जा सके। अगला स्पर्श अभी भी सामान्य के रूप में प्राप्त किया जाएगा।