UIScrollView की क्षैतिज स्क्रॉलिंग को अक्षम कैसे करें?


92

मेरे पास UIViewआईफोन के स्प्रिंगबोर्ड जैसा है। मैं इसे बनाया है का उपयोग कर एक UIScrollViewऔर UIButtons। मैं स्क्रॉल स्क्रॉल पर क्षैतिज स्क्रॉलिंग को अक्षम करना चाहता हूं। मुझे केवल वर्टिकल स्क्रॉलिंग चाहिए। मैं इसे कैसे पूर्ण करूं?


5
आपको अपना शीर्षक बदलना चाहिए: आप प्रश्न में क्षैतिज और शीर्षक में लंबवत पूछते हैं। लोग आपके प्रश्नों को बाद में खोज इंजन पर खोजते हैं, इसलिए 2 साल बाद भी यह बात मायने रखती है :)
जूलियन

@RahulVyas ऊपर वाले के पास एक बिंदु है। शीर्षक बदलने से खोज इंजन के माध्यम से यहां पहुंचने वाले शुरुआती लोगों के लिए किसी भी भ्रम में कमी आएगी (जैसे कि मेरे;)।
स्पैसरीसोचेट

पोस्टर की ओर से शीर्षक संपादित किया है। (हालांकि यह वर्तमान में संपादित होने से पहले सहकर्मी समीक्षा की प्रतीक्षा कर रहा है।)
डंकन बैबेज

जवाबों:


125

आपको की contentSizeसंपत्ति निर्धारित करनी होगी UIScrollView। उदाहरण के लिए, यदि आपका UIScrollView320 पिक्सेल चौड़ा (स्क्रीन की चौड़ाई) है, तो आप ऐसा कर सकते हैं:

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];

UIScrollViewउसके बाद ही खड़ी स्क्रॉल करेगा, क्योंकि यह पहले से ही क्षैतिज सब कुछ प्रदर्शित कर सकते हैं।


6
नमस्ते। यह समाधान वास्तव में ठीक काम करता है! उसके लिए धन्यवाद। मैंने 0. की स्थैतिक चौड़ाई निर्धारित करने की कोशिश की। मेरे लिए यह काम भी करता है। मुझे नहीं पता कि बाद में कुछ दुष्प्रभाव हो सकते हैं। लेकिन अगर कोई आकार (यानी आईफोन और आईपैड के लिए सार्वभौमिक कोड) नहीं जानता है तो यह बहुत अच्छा काम करता है!
जैकपियरस

5
मुझे लगता है कि CGSizeMake करना बेहतर है (0, myScrollableHeight), इसलिए क्षैतिज स्क्रॉलिंग अक्षम है भले ही सभी साक्षात्कार नहीं दिखाए गए हों।
लाइटनट

एनबी को पेजिंग का उपयोग करते हुए आयामों में से एक की स्थापना करना वॉयसओवर को सही मूल्य की परवाह किए बिना पेज नंबर को "पेज 1 का 1" घोषित करने का कारण
बनेगा

1
320 हार्डकोड के रूप में चौड़ाई पास करने के बजाय, हम जैसे पास कर सकते हैं: CGSize स्क्रॉल करने योग्य = CGSizeMake (self.scrollview.frame.size. उपलब्धता, myScrollableHeight); [myScrollView setContentSize: स्क्रॉल करने योग्य आकार];
मोहित कुमार

90

अद्यतन: (@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:विधि में स्क्रॉलिंग को रोक देता है।


1
मैं नीच विचार कर रहा हूं क्योंकि यह उत्तर स्पष्ट नहीं करता है कि यह स्व है आपने अभी कोड दिया है और यह है। इस तरह का उत्तर बहुत अच्छा नहीं है। अच्छा जवाब खुद को समझाते हैं, जबकि अनुभवी डेवलपर्स समझ सकते हैं कि यह नया डेवलपर्स समझ नहीं सकता है कि यहां क्या हो रहा है। सुधार करने का मौका देने के रूप में अभी तक नीचे नहीं किया गया है।
पोपनी

13
यह एक हैक की तरह है, लेकिन यह तब काम करता है जब बाकी सब विफल हो जाता है। तो +1, लेकिन केवल अंतिम उपाय के रूप में उपयोग करें।
I_am_jorf

5
मैं इस प्रतिनिधि पद्धति का भी उपयोग करता हूं, लेकिन मैं शरीर को एक-लाइनर के साथ प्रतिस्थापित करता हूं, जैसे: scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);क्षैतिज स्क्रॉलिंग को अक्षम करने के लिए। मुझे यह अधिक पठनीय लगता है, यह छोटा है, और शून्य के लिए परीक्षण करने का कोई मतलब नहीं है, क्योंकि कोड के साथ लगभग कोई ओवरहेड नहीं है जो इसे बार-बार चलाता है (यानी प्रति सेकंड अधिकतम कुछ बार दसियों)।
इचेलन

क्योंकि आप "doscroll" के बाद contentOffset बदल रहे हैं, 'willscroll' से पहले की तरह नहीं, और यह एक हथौड़ा समाधान है, लेकिन मैंने खुद को डाउनवोट नहीं किया, क्योंकि 18 अपवोट और उत्तर 75 है, इसलिए यह डाउनवोट के लिए योग्य नहीं है
लोला रुन

2
और भी आसान, scrollView.contentOffset.y = 0.0ऊर्ध्वाधर स्क्रॉलिंग scrollView.contentOffset.x = 0.0को रोकने के लिए और क्षैतिज स्क्रॉलिंग को रोकने के लिए, scrollViewDidScroll()प्रतिनिधि कार्य में उपयोग करें। हालांकि, मेरा मानना ​​है कि यह सुनिश्चित करना कि scrollView.contentSizeबराबरी scrollView.frame.sizeएक बेहतर (सही) समाधान है। @Danbeaulieu उत्तर देखें।
एमेम

11

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 स्क्रॉलव्यू के समान ही थी। कॉन्टेंटऑफसेट और पेज डिटेक्शन लॉजिक ठीक से काम नहीं करता है।
sig

11

स्विफ्ट समाधान

दो आउटलेट बनाएं, एक आपके विचार के लिए और एक आपके स्क्रॉल दृश्य के लिए:

@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)

यदि आपको ऊंचाई या चौड़ाई (सार्वभौमिक उपकरण) का पता नहीं है तो क्या होगा? @danbeaulieu
लुकेसिवे

@lukesIvi "myView.frame.width" गतिशील रूप से "myView" IBOutlet से चौड़ाई खींच रहा है।
डैन ब्यूलियू

4

मेरे मामले में, स्विफ्ट 4.2 के साथ आप उपयोग कर सकते हैं:

लंबवत स्क्रॉल अक्षम करें:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}

क्षैतिज स्क्रॉल अक्षम करें:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0.0
}

3

आप दृश्य का चयन कर सकते हैं, फिर Attributes Inspectorअनचेक के तहत User Interaction Enabled


3

मेरे मामले में contentView की चौड़ाई UIScrollView की चौड़ाई से अधिक थी और यही अवांछित क्षैतिज स्क्रॉलिंग का कारण था। UIScrollView की चौड़ाई के बराबर contentView की चौड़ाई सेट करके मैंने इसे हल किया।

आशा है कि यह किसी की मदद करता है


@ नोस्ट्राडमस मदद करने के लिए खुश
खान

0

मेरे पास टेबलव्यू कंटेंट था। इनडिट सेट सेट व्यूडीडलड (नीचे) जैसा कि क्षैतिज स्क्रॉलिंग के कारण

self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);

जांचें कि क्या कोई टेबलव्यू कंटेंट है। अलग-अलग कारणों से सेट करें और इसे अक्षम करें


0

मैं कुछ समय तक इस और अन्य सूत्र में विभिन्न सुझावों को असफल करने की कोशिश से जूझता रहा।

हालांकि, एक और सूत्र में (निश्चित नहीं है कि कहां) किसी ने सुझाव दिया कि UIScrollView पर एक नकारात्मक बाधा का उपयोग करके उसके लिए काम किया।

इसलिए मैंने असंगत परिणामों के साथ बाधाओं के विभिन्न संयोजनों की कोशिश की। आखिरकार मेरे लिए जो काम किया गया, वह -32 की अग्रणी और अनुगामी बाधाओं को स्क्रॉलव्यू में जोड़ने और 320 (और केंद्रित) की चौड़ाई के साथ एक (अदृश्य) पाठ जोड़ने के लिए था।


0

इसे इस्तेमाल करे:

CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];

0

contentOffsetउपवर्ग में संपत्ति को ओवरराइड करके क्षैतिज स्क्रॉल अक्षम करें ।

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: 0, y: newValue.y)
  }
}

0

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



-1

इस सिंगल लाइन का उपयोग करें।

self.automaticallyAdjustsScrollViewInsets = NO;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.