2011-12-04 13 views
8

मैं UIScrollview के स्वाइप क्षेत्र को सीमित करने की कोशिश कर रहा हूं, लेकिन मैं ऐसा करने में सक्षम नहीं हूं।UIScrollview सीमा स्वाइप क्षेत्र

मैं केवल यूआईएसक्रॉलव्यू के शीर्ष पर स्वाइप क्षेत्र सेट करना चाहता हूं, लेकिन मैं सभी सामग्री को दृश्यमान सेट करना चाहता हूं।

अद्यतन:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count] > 0) { 
     UITouch *tempTouch = [touches anyObject]; 
     CGPoint touchLocation = [tempTouch locationInView:self.categoryScrollView]; 
     if (touchLocation.y > 280.0) 
     { 
      NSLog(@"enabled"); 
      self.categoryScrollView.scrollEnabled = YES; 
     } 
    } 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
// [super touchesEnded:touches withEvent:event]; 
    self.categoryScrollView.scrollEnabled = YES; 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

समाधान: आपके विचार नियंत्रक में touchesBegan:withEvent: ओवरराइड UIScrollView पर नहीं करने के लिए delaysContentTouches स्थापित करने के लिए

self.categoryScrollView.delaysContentTouches = NO; 
+0

अच्छा है! 2 साल बाद आपने मेरी मदद की: पी – NSPunk

उत्तर

7

आप UIScrollView पर स्क्रॉल निष्क्रिय कर सकते हैं भूल जाते हैं न,, देखें कि क्या उस क्षेत्र में कोई भी स्पर्श शुरू हुआ जहां आप स्वाइप सक्षम करना चाहते हैं, और यदि उत्तर 'हां' है, तो स्क्रॉलिंग को फिर से सक्षम करें। छूने खत्म होने पर स्क्रॉलिंग को अक्षम करने के लिए touchesEnded:withEvent: और touchesCancelled:withEvent: ओवरराइड करें।

+0

हाय, कुछ गलत हो गया। टच समाप्त होने के बाद स्वाइप केवल सक्षम हो जाता है, वर्तमान स्पर्श चरण के दौरान नहीं :( –

+0

@ ViskyMáté मुझे यकीन नहीं था कि यह काम करेगा, लेकिन मुझे लगता है कि यह एक शॉट के लायक था। कोशिश करने की एक और चीज स्क्रॉल सक्षम रखेगी , इसे 'स्पर्शों में अक्षम करें: withEvent:' यदि वे क्षेत्र के बाहर हैं, और 'touchesEnded'/'touchesCancelled' में स्क्रॉल को फिर से सक्षम करें। – dasblinkenlight

+0

यह काम करना शुरू हो गया है, लेकिन :(यह सभी काम नहीं कर रहा है उस समय। टचबिजिन/रद्द/निकाला जाने से पहले थोड़ी देर हो चुकी है, यही कारण है कि अगर मैं तेजी से पिंच कर रहा हूं, तो यह काम नहीं करता है, किसी अन्य समय यह काम कर रहा है। अगर आप इस देरी को चालू करने में मेरी मदद कर सकते हैं (i यह नहीं पता कि यह कहां है) यह बहुत अच्छा होगा, और सफल समाधान –

4

This blog post कार्यक्षमता को लागू करने का एक बहुत ही सरल और साफ तरीका दिखाता है।

// init or viewDidLoad 

    UIScrollView *scrollView = (UIScrollView *)view; 
    _scrollViewPanGestureRecognzier = [[UIPanGestureRecognizer alloc] init]; 
    _scrollViewPanGestureRecognzier.delegate = self; 
    [scrollView addGestureRecognizer:_scrollViewPanGestureRecognzier]; 

// 

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

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer == _scrollViewPanGestureRecognzier) 
    { 
    CGPoint locationInView = [gestureRecognizer locationInView:self.view]; 
    if (locationInView.y > SOME_VALUE) 
    { 
     return YES; 
    } 
    return NO; 
    } 
    return NO; 
} 
4

अन्य उत्तरों मेरे लिए काम नहीं किया। उपclassing UIScrollView मेरे लिए काम किया (स्विफ्ट 3):

class ScrollViewWithLimitedPan : UIScrollView { 
    // MARK: - UIPanGestureRecognizer Delegate Method Override - 
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     let locationInView = gestureRecognizer.location(in: self) 
     print("where are we \(locationInView.y)") 
     return locationInView.y > 400 
    } 
} 
+0

मुझे लगता है कि यह जाने का "सबसे साफ" तरीका है। –

+0

यह आसान है, चीयर्स – jarryd