2012-12-21 46 views
6

मुझे कुछ उंगली चुटकी को लागू करने की कोशिश कर रहे कुछ मुद्दे हैं।तीन उंगली चुटकी इशारा

मैं 2 उंगली रोटेशन के साथ एक 2 उंगली चुटकी का उपयोग कर रहा हूं, व्यक्तिगत रूप से! (कोई एक साथ इशारा जरूरी या चाहता था) समस्या यह है कि कई बार, सिस्टम गलत आंदोलन की पहचान करता है क्योंकि उनमें से दोनों बहुत समान हैं, इसलिए मैं अपनी उंगलियों को हटाने और सिस्टम की पहचान करने की कोशिश करने के लिए फिर से दबाता हूं घूर्णन (आमतौर पर यह पहले चुटकी की पहचान करता है)

मैंने यह देखने के लिए बहुत कुछ खोजा कि delayBegin मदद करेगा, या अगर मैं एक साथ इशारा करते हुए कुछ कर सकता हूं, लेकिन कोई भी ठीक काम नहीं करता है, तो मेरा विचार उपयोग करने के बजाय था चुटकी के लिए 2 उंगलियां, मैं 3 का उपयोग कर सकता था (चूंकि घूर्णन से पिंच करना आसान है)।

समस्या यह है कि, जैसा कि आप जानते हैं, पिंच केवल 2 अंगुलियों के साथ काम करता है। इसलिए मैंने फैसला किया कि मैं UIPinchGestureReconizer उप-वर्ग कर सकता हूं और स्क्रीन पर 3 अंगुलियों के दौरान इसे केवल काम करने की अनुमति देता हूं। शेष यह मानक चुटकी के काम के रूप में काम कर सकता है, यहां तक ​​कि तीसरी उंगली को भी अनदेखा कर सकता है (स्केल की गणना करने के लिए) लेकिन यह सुनिश्चित कर रहा है कि तीसरी उंगली अभी भी स्क्रीन पर है।

तो मैं अपने ThreeFingerPinchRecognizer (कि उप वर्गों UIPinchGestureRecognizer) के लिए निम्नलिखित कार्यान्वयन की कोशिश की

@implementation GRThreeFingerPinchRecognizer 

-(id)initWithTarget:(id)target action:(SEL)action 
    { 
    self = [super initWithTarget:target action:action]; 
    if(self){ 
    } 
    return self; 
} 

- (void)reset 
{ 
    [super reset]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    int numberOfTouches = event.allTouches.count; 
    if (numberOfTouches == 3) 
    { 
     [super touchesMoved:touches withEvent:event]; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
     [super touchesEnded:touches withEvent:event]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesCancelled:touches withEvent:event]; 
} 

तो, जैसा कि आप देख सकते हैं, मैं (2 उंगली चुटकी की ही कार्यक्षमता प्राप्त करने के लिए कोशिश कर रहा हूँ से केवल [super] कार्यों आह्वान करने और touchesBegan और touchesMoved समारोहों में, मैं अगर वहाँ स्क्रीन पर 3 उंगलियों का परीक्षण कर रहा हूँ (event.alltouches.count को देखकर)

इस के साथ

, रोटेशन दो उंगलियों के साथ सही काम कर रहा है, लेकिन चुटकी एन है ओटी बहुत अच्छी तरह से काम कर रहा है, इसे सक्रिय करने के लिए मुश्किल है और जब यह करता है, यह दो उंगली चुटकी के रूप में काम नहीं करता है ...

मुझे पता है कि मैं यह पूरी तरह से गलत कर रहा हूं, इसलिए कोई मदद महान होगी !!

बहुत बहुत धन्यवाद!

+0

Intersting दृष्टिकोण है, लेकिन PinchGestureRecognizer (जो अंत में आप लागू कर रहे हैं) शायद 2 छूता नहीं 3 उम्मीद कर रही है, मैं शायद करने की कोशिश करेगा सुपर कॉल करने से पहले छूने में से एक को हटा दें..तुम्हें यह पता लगाना होगा कि कौन से को हटाने के लिए .. – Daniel

+0

मुझे विश्वास था कि इसे पिनचस्टेस्टर के अंदर संभाला जाता है, क्योंकि मैं इस घटना में कुछ भी नहीं बदल रहा हूं, मैं केवल इसे अग्रेषित कर रहा हूँ! अगर मैं "अगर" को हटा देता हूं, तो चुटकी सही ढंग से काम करती है (लेकिन 2 उंगलियों के साथ) –

+0

* एक अच्छी नोट: 3 उंगली सुविधाएं उन डिवाइस उपकरणों पर काम नहीं करतीं जिनके पास सेटिंग्स में ज़ूम सक्षम है (एक ऐप्पल सुविधा जहां आप स्क्रीन को 3 से टैप करते हैं ज़ूम इन करने के लिए उंगलियां (किसी भी ऐप में, स्क्रीनशॉट सुविधा किसी ऐप में कैसे काम करती है)) ... ऐप क्षमता के लिए 3 फाइनर डिटेक्टिंग का उपयोग करना होम-बटन डिटेक्शन फीचर का उपयोग करने के रूप में घातक हो सकता है। (मैं, कई अन्य लोगों के साथ यह ज़ूम सुविधा सक्षम है) –

उत्तर

0

इस स्निपेट मदद कर सकते हैं यू चुटकी के राज्य की पहचान देखें:

if (pinch.numberOfTouches > 1) 
{ 
    CGPoint firstPoint = [pinch locationOfTouch:0 inView:self]; 
    CGPoint secPoint = [pinch locationOfTouch:1 inView:self]; 
    currentUpperY = MIN(firstPoint.y, secPoint.y); 
    if (previousY == 0) previousY = currentUpperY; 
    Float32 y = (self.contentOffset.y + previousY - currentUpperY); 
    [self setContentOffset:CGPointMake(0, y < 0 ? 0 : y) animated:NO]; 

    if (pinch.state == UIGestureRecognizerStateBegan) 
    { 
     pinchStarted = YES; 
     firstY = MIN(firstPoint.y, secPoint.y); 
     secondY = MAX(firstPoint.y, secPoint.y); 
     NSArray *pinchedIndexs = [self indexPathsForRowsInRect:CGRectMake(0.0, firstY, CGRectGetWidth(self.bounds), secondY)]; 
     if (pinchedIndexs.count) itemToOpenOrClose = [[currentItems subarrayWithRange:NSMakeRange(((NSIndexPath *)[pinchedIndexs objectAtIndex:0]).row, pinchedIndexs.count - 1)] copy]; 
    } 
} 

if ((pinch.state == UIGestureRecognizerStateChanged && pinchStarted && itemToOpenOrClose.count) 
    || pinch.state == UIGestureRecognizerStateEnded) 
{ 
    if (pinch.scale > 1) // Pinch OUT 
    { 
     for (Item *item in itemToOpenOrClose) 
     {     
      [self openItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 
    else if (pinch.scale < 1) // Pinch IN 
    { 
     for (Item *item in itemToOpenOrClose) 
     { 
      [self closeItem:item inIndexPath:[NSIndexPath indexPathForRow:[currentItems indexOfObject:item] inSection:0]]; 
     } 
    } 

    if (pinch.state == UIGestureRecognizerStateEnded) 
    { 
     pinchStarted = NO; 
     itemToOpenOrClose = nil; 
     previousY = 0; 
    } 
}