2012-01-03 12 views
11

मुझे पेजिंग सक्षम के साथ UIScrollView मिला है, और मैंने इसे अपना UIPanGestureRegonizer जोड़ा है। कुछ मामलों के तहत, मेरे विचार नियंत्रक scrollview.scrollEnabled = NO सेट हो जाएगा, और फिर इसे करने के लिए पैन इशारा पहचानकर्ता जोड़ने (मैं scrollview के स्वयं के पहचानकर्ता का उपयोग नहीं कर रहा हूँ)।UIPanGestureRecognizer के बीच निरंतर स्क्रॉलिंग और पुनः सक्षम UIScrollView

तो, स्क्रॉल अक्षम किया गया है लेकिन मैं अपने इशारे पहचानकर्ता से उपयोगकर्ता छूता के लिए इंतज़ार कर रहा हूँ। जब यह पहचानता है, तो यह उसकी क्रिया को कॉल करता है जिसमें मैं स्क्रॉलिंग को पुनः सक्षम करता हूं।

समस्या यह है, उपयोगकर्ता अभी भी एक उंगली नीचे है, जबकि, मेरे scrollview उंगली से ट्रैक नहीं करता। यह तब तक स्क्रॉलिंग शुरू नहीं करता जब तक कि उंगली उठाई न जाए और फिर फिर से खींचा जाए। तो मेरा इशारा पहचानकर्ता सभी स्पर्शों को निगल रहा है और स्क्रॉलव्यू में किसी को भी अग्रेषित नहीं कर रहा है।

मैंने panGestureRecognizer.cancelsTouchesInView = NO; को टॉगल करने का प्रयास किया है, लेकिन ऐसा कोई प्रतीत नहीं होता है (जैसे ही मैं स्क्रॉलिंग को पुनः सक्षम करता हूं, लेकिन मैं इस पहचानकर्ता को हटा रहा हूं लेकिन मैं यह करता हूं या नहीं, मेरी समस्या का समाधान नहीं करता) । मैंने delays...UIGestureRecognizer के गुणों में भी देखा है, लेकिन वे मदद नहीं कर रहे हैं, या तो।

कोई विचार? मैं इन घटनाओं को अपने स्क्रॉलव्यू पर आगे बढ़ने के लिए कैसे प्राप्त कर सकता हूं? अगर आप केवल क्योंकि उस मामले में आप वास्तव में UIScrollView panGestureRecognizer संपत्ति का पुन: उपयोग करना चाहिए, iOS 5 और ऊपर लक्षित कर रहे हैं

+0

आप में' 'gestureRecognizer YES' लौटने की कोशिश की? – Hejazi

+0

@ हेजाज़ी हां मैंने उस प्रतिनिधि विधि को भी लागू किया है (और मेरे प्रतिनिधि को सेट करें) लेकिन उंगली अभी भी नीचे होने पर इसे कॉल नहीं किया जाता है (केवल एक बार जब मैंने उठा लिया है और उंगली को फिर से नीचे रखा है तो यह प्रतिनिधि विधि बुलाया जाता है) । – jbrennan

उत्तर

5

जवाब थोड़ा आसान है।

किसी भी मामले में, कुंजी चरण स्क्रॉल का पुन: उपयोग नहीं करना है, लेकिन इसके बजाय UIScrollView को उपclass करने के लिए, इस स्थिति को प्रबंधित करने के लिए अपनी खुद की संपत्ति बनाएं, और setContentOffset को ओवरराइड करें:।

- (void) setContentOffset:(CGPoint)contentOffset 
    { 
     if(self.programaticScrollEnabled) 
      [super setContentOffset:contentOffset]; 
    } 

यहाँ एक संभव iOS 4+ समाधान है:

  1. उपवर्ग UIScrollView (या UIScrollView का एक और उपवर्ग उपवर्ग, अपनी आवश्यकताओं के आधार पर)।
  2. सुनिश्चित करने के लिए अपने स्थापना कोड कहा जाता है सब initializers ओवरराइड।
  3. BOOL संपत्ति घोषित करें और setContentOffset ओवरराइड: के रूप में ऊपर वर्णित है।
  4. अपने सेटअप कोड में, एक UIPanGestureRecognizer की स्थापना की और (यह सोचते हैं कि डिफ़ॉल्ट स्थिति आप चाहते है) programatic स्क्रॉल अनुमति देने के लिए अपने राज्य चर सेट:

    panRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease]; 
    //These properties may change according to your needs 
    panRecognizer.cancelsTouchesInView = NO; 
    panRecognizer.delaysTouchesBegan = NO; 
    panRecognizer.delaysTouchesEnded = NO; 
    [self addGestureRecognizer:panRecognizer]; 
    panRecognizer.delegate = self; 
    
    self.programaticScrollEnabled = YES; 
    
  5. प्रबंधित करें कि कौन इशारों एक साथ हो सकता है। मेरे मामले में:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    { 
        return YES; 
    } 
    
  6. आपको उपलब्ध हो जाए पर वापस programatic स्क्रॉल करें। उदाहरण के लिए: shouldRecognizeSimultaneouslyWithGestureRecognizer: `विधि

    - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
    } 
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
        return YES; 
    } 
    
संबंधित मुद्दे