2012-06-12 15 views
10

की स्क्रॉलिंग को रोकता है मेरे पास UIScrollview के अंदर एक (लंबवत) UISlider है। मैं स्लाइडर के मान को बदलने में सक्षम होना चाहता हूं, और, मेरी उंगली उठाए बिना, स्क्रॉलव्यू को बाएं या दाएं स्क्रॉल करें।UISlider पर स्पर्श UIScrollView

वांछित व्यवहार:

खड़ी UISlider अंदर नीचे टच, एक उंगली खींचें के बाद बाएं या दाएं scrollview स्क्रॉल करने के लिए कारण बनता है

वास्तविक व्यवहार:

खड़ी UISlider अंदर नीचे टच , एक उंगली खींचने के बाद बाएं या दाएं यूआईएसक्रोलव्यू में कोई आंदोलन नहीं होता है। उम्मीद

रूप

UIView एक संपत्ति exclusiveTouch कहा जाता है जो के रूप में अगर यह मेरी समस्या से संबंधित हो सकती लगता है नीचे बाहर एक स्पर्श UISlider एक खींचें के बाद scrollview स्क्रॉल करेगा। मैंने बिना किसी किस्मत के इसे स्थापित करने की कोशिश की।

तो, मेरे यूआईएसलाइडर कैसे स्थापित किए जा सकते हैं ताकि उनके नीचे स्क्रॉलव्यू यूआईएसलाइडर के अंदर उत्पन्न होने वाले स्पर्शों का जवाब दे सके?

+5

+1 वांछित/अपेक्षित परिणाम बनाम वास्तविक परिणाम के लिए +1। अधिक प्रश्न यह करना चाहिए। –

उत्तर

4

क्या आपने UIScrollView उपclassing और - (BOOL)touchesShouldCancelInContentView:(UIView *)view लागू करने का प्रयास किया है?एप्पल प्रलेखन के अनुसार:

// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur 
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl 

आप बस NO वापस नहीं आ जाते, तो view अपने UISlider है, इस मई क्षैतिज अपने UIScrollView केवल स्क्रॉल संभालने तुम क्या चाहते हो,। अगर यह काम नहीं करता है, आप की संभावना कस्टम कर से निपटने को छूने के लिए होगा (यानी। touchesBegan:withEvent:, touchesChanged:withEvent:, आदि अधिभावी) अपने UIScrollView और अपने UISlider दोनों के लिए।

+0

चाल थी। धन्यवाद! – morgancodes

2

जो आप देख रहे हैं वह इच्छित व्यवहार है।

प्रत्येक स्पर्श ईवेंट केवल एक नियंत्रण द्वारा संभाला जाता है। exclusiveTouch वास्तव में अन्य को अन्य दृश्यों पर पहुंचने से स्पर्श ईवेंट को रोकने के लिए वास्तव में है।

ऐसा करने के लिए जो आपको करने की कोशिश कर रहे हैं, आपको स्वयं को कुछ स्पर्श करने होंगे। घटना को अपने दोनों विचारों में पास करना। आप या तो touchesBegan:, touchesMoved: आदि विधियों को लागू करके और दोनों विचारों को ईवेंट को पास करके ऐसा कर सकते हैं। आप UIResponder documentation में उस दृष्टिकोण के बारे में अधिक पढ़ सकते हैं। एक और तरीका स्क्रॉल व्यू पर UIGestureRecognizer में ईवेंट हैंडलिंग करना है जो स्लाइडर का परीक्षण करता है और वाई-डेल्टा का उपयोग करके स्लाइडर के मान को अद्यतन करता है। आप the section about Gesture Recognizers in the Event Handling Guide for iOS में इशारा पहचानकर्ताओं और ईवेंट हैंडलिंग के बारे में अधिक पढ़ सकते हैं।


साइड नोट:

सेटिंग एप्लिकेशन पर जाएं और एक स्विच आधे रास्ते (उदाहरण के लिए हवाई जहाज मोड टॉगल) को चालू और फिर नीचे खींचें। कुछ नहीं होगा। बाकी ओएस एक ही तरीके से व्यवहार करता है। क्या आप वाकई यह बातचीत कर रहे हैं कि आप वास्तव में करना चाहते हैं? अलग-अलग व्यवहार करने वाले ऐप्स अक्सर अजीब और अपरिचित महसूस करते हैं।

+0

+1 "तुम अपने आप को संभालने के स्पर्श से कुछ करने के लिए होता है क्या करने के लिए कोशिश कर रहे हैं ऐसा करने के लिए।" – morgancodes

+0

@morgancodes हाँ, शायद अस्पष्ट करने के लिए एक सा। मैंने अपने स्वयं के स्पर्श हैंडलिंग को कैसे करें, इसके लिए प्रासंगिक दस्तावेज के दो बुनियादी विकल्प और लिंक जोड़े। –

1

आपके प्रश्न ने मुझे थोड़ा उलझन में डाल दिया। आप एक लंबवत स्लाइडर कह रहे हैं - लेकिन बाएं और दाएं खींच रहे हैं?

आप जब UISlider, ऐसा करने के लिए उचित तरीके से खींच scrollview स्क्रॉल करने के लिए चाहते हैं, तो

[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged]; 

और

- (void) sliderMoved:(UISlider*) slider { 
    myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width); 
} 

आशा है कि आप यही चाहते है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन यह वह नहीं है जो मैं पूछ रहा हूं। मैं यह पता लगाने की कैसे touchesMoved घटना UIScrollView ही नहीं, scrollview के अंदर UISlider को लागू करने के लिए अनुमति देने के लिए कोशिश कर रहा हूँ। मैं एक ऊर्ध्वाधर खींचें, जिस तरह से यह होगा स्लाइडर के मूल्य, और एक क्षैतिज खींचें UIScrollView की स्थिति बदलने के लिए बदलने के लिए अगर वहाँ रास्ते में खड़ी स्लाइडर नहीं था चाहते हैं। – morgancodes

0

मुझे लगता है कि आप this उदाहरण से कुछ संदर्भ प्राप्त कर सकते हैं उदाहरण में यह दिखाया गया है कि किसी भी स्पर्श या किसी भी इशारा पहचानकर्ता को कैसे रद्द करें और उन्हें अन्य विचारों पर लागू करें।

इस नेतृत्व आप अपनी समस्या के समाधान के लिए और अगर यह बस मुझे के बारे में यह

मुबारक codding :)

1

आप नहीं के रूप में delaysContentTouches सेट और UISlider वस्तुओं स्क्रॉल करने के लिए के लिए रोकने के लिए की जरूरत है दूँगी मई कोड नीचे की जाँच करें।

mySlider.delaysContentTouches = NO; 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    if ([view isKindOfClass:[UISlider class]]) 
    { 
     UITouch *touchEvent = [[event allTouches] anyObject]; 
     CGPoint locationEvent = [touchEvent locationInView:view]; 
     CGRect thumbRect; 
     UISlider *mySlide = (UISlider*) view; 
     CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds]; 
     thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value]; 
     if (CGRectContainsPoint(thumbRect, locationEvent)) 
      return YES; 
    } 
    return NO; 
}