2011-02-09 13 views
12

समाप्त हो रहा है मैं अपने आईफोन ऐप में रोटेशन इशारा को संभालना चाहता हूं और इसके दौरान एक छवि दृश्य को घुमाने के लिए चाहता हूं। इशारा के अंत में मैं imageView की एक फिक्स स्थिति पर घूमना चाहता हूं। यानी। अगर मैं छवि दृश्य को 0 रेडियन से एमएफआई/2 रेडियंस तक घुमाता हूं, लेकिन आधे रास्ते पर मैं इशारा के साथ समाप्त होता हूं। अंत के बाद मैं कोण परीक्षण करने के लिए और अगर यह पास M_PI को/2 तो यह M_PI करने के लिए सेट करना चाहते हैं/2 अन्यथा करने के लिए 0.
यहाँ मेरी कोड है कि कैसे मैं यह कर की कोशिश की:UIGestureRecognizer

मैं बना सकते हैं और जोड़ने मेरे विचार के लिए पहचानकर्ता।

UIGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)]; 
recognizer.delegate = self; 
[self addGestureRecognizer:recognizer]; 
[recognizer release]; 

प्रतिनिधि तरीके:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if (_imageView) { 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

इशारा मान्यता प्राप्त विधि:

- (void)gestureRecognized:(UIRotationGestureRecognizer *)recognizer { 
    _imageView.transform = CGAffineTransformMakeRotation(recognizer.rotation); 
} 

इन विधियों काम कर रहे हैं, लेकिन यहां विधि कैसे मैं इशारा के अंत प्राप्त करने की कोशिश है। यह काम नहीं कर रहा है:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"gesture end"); 
} 

इसके अलावा ट्रांसफॉर्म के साथ मुझे एक छोटी सी समस्या है। कभी-कभी यह 0 रेडियन पर वापस जा रहा है।

कोई भी सुझाव स्वागत है। धन्यवाद!

उत्तर

25

मुझे एक अन्य मंच पर जवाब मिला है। मुझे उम्मीद है कि यह किसी और की भी मदद करेगा। उत्तर:

आप अपने कार्रवाई विधि में UIRotationGestureRecognizer की राज्य की जाँच करके इशारा के अंत का पता लगा सकते। यदि [जेस्चर रिकॉग्नाइज़र स्टेटस] == UIGestureRecognizerStateEnded तो यह हो गया है। अगर कुछ इसके बदले में इसे रद्द कर दिया गया था (उदाहरण के लिए, एक फोन कॉल आ रहा है) तो आप इसे इसके बजाय UIGestureRecognizerStateCancelled में समाप्त कर देंगे।

यदि आप पिछले स्थान से डेल्टा के रूप में व्यवहार करने के बजाय पहचानकर्ता के घूर्णन को सीधे अपने दृश्य में लागू करना चाहते हैं तो आप पहचानकर्ता के घूर्णन को सेट कर सकते हैं, इसकी स्थिति UIGestureRecognizerStateBegan है, और फिर यह उस मान से ऑफ़सेट की गणना करेगी और आप उन्हें सीधे लागू कर सकते हैं। यह सिर्फ इतना है कि आपको उस रोटेशन को याद रखें जिसे आपने आखिरी बार समाप्त किया था, और फिर आप कुछ ऐसा कर सकते हैं जैसे [जेस्चर रिकॉग्नाइज़र सेटरोटेशन: lastAppliedRotation] जब पहचानकर्ता का राज्य UIGestureRecognizerStateBegan है।

1

gestureRecognizer इशारा, डिफ़ॉल्ट रूप से touchesEnded नहीं कहा जा होगा पहचानता है (touchesCancelled बजाय बुलाया जाएगा। touchesEnded केवल कहा जा सकता है, तो पहचानकर्ता इशारा नहीं पहचानता है)। gestureRecognizer.delaysTouchesEnded से NO पर सेट करें, और इसे काम करना चाहिए।

+0

यह काम नहीं कर रहा है। तुम जानते हो क्यों? अभी भी अंत प्राप्त नहीं कर रहा है। –

+0

तो विधि अब कहलाती है, लेकिन जब मैं अपनी उंगलियों को छोड़ता हूं, तो मुझे रोटेशन –

+0

शुरू करने के बाद कहा जाता है, इसलिए इसे अंत में नहीं कहा जाता है। कोई सुराग? –

0

शायद ज़रुरत पड़े इस रूप में अच्छी तरह आपके साथ होता है और यह कारण है कि आप उस सवाल पढ़ रहे है: "समाप्त हो गया" और "मान्यता प्राप्त" एक ही मान रहे हैं (3)। तो यह कोड (स्विफ्ट में) काम नहीं करेगा:

if (gesture.state == .recognized || gesture.state == .changed) { 
} 
else if (gesture.state == .ended) { 
//do something else 
//=> never called 
} 
संबंधित मुद्दे