मेरे पास UIView
आईफोन के स्प्रिंगबोर्ड जैसा है। मैं इसे बनाया है का उपयोग कर एक UIScrollView
और UIButtons
। मैं स्क्रॉल स्क्रॉल पर क्षैतिज स्क्रॉलिंग को अक्षम करना चाहता हूं। मुझे केवल वर्टिकल स्क्रॉलिंग चाहिए। मैं इसे कैसे पूर्ण करूं?
मेरे पास UIView
आईफोन के स्प्रिंगबोर्ड जैसा है। मैं इसे बनाया है का उपयोग कर एक UIScrollView
और UIButtons
। मैं स्क्रॉल स्क्रॉल पर क्षैतिज स्क्रॉलिंग को अक्षम करना चाहता हूं। मुझे केवल वर्टिकल स्क्रॉलिंग चाहिए। मैं इसे कैसे पूर्ण करूं?
जवाबों:
आपको की contentSize
संपत्ति निर्धारित करनी होगी UIScrollView
। उदाहरण के लिए, यदि आपका UIScrollView
320 पिक्सेल चौड़ा (स्क्रीन की चौड़ाई) है, तो आप ऐसा कर सकते हैं:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
UIScrollView
उसके बाद ही खड़ी स्क्रॉल करेगा, क्योंकि यह पहले से ही क्षैतिज सब कुछ प्रदर्शित कर सकते हैं।
अद्यतन: (@EranMarom ने अपनी टिप्पणी के बाद)
आप विधि में क्षैतिज स्क्रॉलिंग या ऊर्ध्वाधर स्क्रॉलिंग रोक सकते हैं ScrollViewDelegate
। यहाँ यह है कि,
क्षैतिज स्क्रॉलिंग बंद कर देता है:
यदि आप क्षैतिज रूप से स्क्रॉल करना चाहते हैं, तो आपको contentOffset.x को बढ़ाने की आवश्यकता है। रोकना जो स्क्रॉलव्यू स्क्रॉल को क्षैतिज दिशा में रोकता है।
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
स्टॉप वर्टिकल स्क्रॉलिंग:
यदि आप लंबवत स्क्रॉल करना चाहते हैं, तो आपको contentOffset.y को बढ़ाना होगा। रोकना जो स्क्रॉलवॉश स्क्रॉल को ऊर्ध्वाधर दिशा में रोकता है।
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
उपरोक्त कोड में x
और y
के परिवर्तन को रोकता है scrollview contentOffset
और यह scrollViewDidScroll:
विधि में स्क्रॉलिंग को रोक देता है।
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
क्षैतिज स्क्रॉलिंग को अक्षम करने के लिए। मुझे यह अधिक पठनीय लगता है, यह छोटा है, और शून्य के लिए परीक्षण करने का कोई मतलब नहीं है, क्योंकि कोड के साथ लगभग कोई ओवरहेड नहीं है जो इसे बार-बार चलाता है (यानी प्रति सेकंड अधिकतम कुछ बार दसियों)।
scrollView.contentOffset.y = 0.0
ऊर्ध्वाधर स्क्रॉलिंग scrollView.contentOffset.x = 0.0
को रोकने के लिए और क्षैतिज स्क्रॉलिंग को रोकने के लिए, scrollViewDidScroll()
प्रतिनिधि कार्य में उपयोग करें। हालांकि, मेरा मानना है कि यह सुनिश्चित करना कि scrollView.contentSize
बराबरी scrollView.frame.size
एक बेहतर (सही) समाधान है। @Danbeaulieu उत्तर देखें।
iOS7 उपयोग के बाद से
self.automaticallyAdjustsScrollViewInsets = NO;
// और आप 3 पेज के साथ पेज स्कोरर बनाएँ
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
चिकनी स्क्रॉलिंग (ड्रैगिंग नहीं) के साथ समस्या को हल करने में मेरी मदद की। समस्या विधि में थी scrollViewWillEndDragging:
- targetContentOffset स्क्रॉलव्यू के समान ही थी। कॉन्टेंटऑफसेट और पेज डिटेक्शन लॉजिक ठीक से काम नहीं करता है।
स्विफ्ट समाधान
दो आउटलेट बनाएं, एक आपके विचार के लिए और एक आपके स्क्रॉल दृश्य के लिए:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
फिर अपने व्यूडीड लाईआउटसाउबस में आप निम्न कोड जोड़ सकते हैं:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
हमने जो किया है वह दृश्य की ऊंचाई और चौड़ाई एकत्र किया है और स्क्रॉलव्यूज़ सामग्री के आकार को उससे मिलाने के लिए सेट किया है। यह आपके स्क्रॉलव्यू को क्षैतिज रूप से स्क्रॉल करने से रोक देगा।
अधिक विचार:
CGSizeMake CGFloats का उपयोग करके एक चौड़ाई और ऊंचाई लेता है। आपको दूसरे पैरामीटर के लिए अपने UIScrollViews की मौजूदा ऊंचाई का उपयोग करने की आवश्यकता हो सकती है। जो इस तरह दिखेगा:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
मेरे मामले में, स्विफ्ट 4.2 के साथ आप उपयोग कर सकते हैं:
लंबवत स्क्रॉल अक्षम करें:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
क्षैतिज स्क्रॉल अक्षम करें:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
मेरे मामले में contentView की चौड़ाई UIScrollView की चौड़ाई से अधिक थी और यही अवांछित क्षैतिज स्क्रॉलिंग का कारण था। UIScrollView की चौड़ाई के बराबर contentView की चौड़ाई सेट करके मैंने इसे हल किया।
आशा है कि यह किसी की मदद करता है
मैं कुछ समय तक इस और अन्य सूत्र में विभिन्न सुझावों को असफल करने की कोशिश से जूझता रहा।
हालांकि, एक और सूत्र में (निश्चित नहीं है कि कहां) किसी ने सुझाव दिया कि UIScrollView पर एक नकारात्मक बाधा का उपयोग करके उसके लिए काम किया।
इसलिए मैंने असंगत परिणामों के साथ बाधाओं के विभिन्न संयोजनों की कोशिश की। आखिरकार मेरे लिए जो काम किया गया, वह -32 की अग्रणी और अनुगामी बाधाओं को स्क्रॉलव्यू में जोड़ने और 320 (और केंद्रित) की चौड़ाई के साथ एक (अदृश्य) पाठ जोड़ने के लिए था।
IOS 11 में पेश की गई एक नई संपत्ति है UIScrollView
var contentLayoutGuide: UILayoutGuide
प्रलेखन में कहा गया है कि आप:
जब आप किसी स्क्रॉल दृश्य के सामग्री क्षेत्र से संबंधित ऑटो लेआउट बाधाएँ बनाना चाहते हैं, तो इस लेआउट गाइड का उपयोग करें।
किसी अन्य autolayout बाधाओं आप जोड़ने जा सकता है कि आप विवश करना चाहते हैं के साथ widthAnchor
की UIScrollView
है contentLayoutGuide
"फ्रेम" के रूप में एक ही आकार के होने के लिए। आप frameLayoutGuide
(आईओएस 11 में भी) या किसी भी बाहरी चौड़ाई का उपयोग कर सकते हैं (जैसे कि आपकेsuperView
's) का ।
उदाहरण:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
प्रलेखन: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutoutguide
एक बार जब मैंने UIScrollView को केवल 1 सेल के साथ UITableView के साथ बदल दिया, तो यह ठीक काम किया।
इस सिंगल लाइन का उपयोग करें।
self.automaticallyAdjustsScrollViewInsets = NO;