UIScrollView में लंबवत स्क्रॉलिंग अक्षम करना


84

स्क्रॉलव्यू पर वर्टिकल स्क्रॉलिंग अनचेक करने के लिए आईबी में एक विकल्प है, लेकिन यह काम नहीं करता है।

स्क्रॉलव्यू को केवल क्षैतिज रूप से स्क्रॉल करने के लिए कैसे सेट किया जा सकता है, और आईबी के बजाय कोड में लंबवत नहीं है?


जवाबों:


121

स्क्रॉल करें की ऊंचाई पर सामग्री की ऊंचाई सेट करने का प्रयास करें। फिर ऊर्ध्वाधर स्क्रॉल को अक्षम किया जाना चाहिए क्योंकि लंबवत स्क्रॉल करने के लिए कुछ भी नहीं होगा।

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

आपने मुझे इस अजीब मुद्दे पर बहस करने में बहुत समय दिया। धन्यवाद!
jpm

2
@fabb फ्रेम को बदलने पर किसी को कैसे पता चलता है?
सैम

137

iOS7 के बाद से:

पहला: सामग्री का आकार चौड़ाई आपके स्क्रॉलव्यू की चौड़ाई के बराबर होना चाहिए

दूसरा: आपके initWithNibName में:

self.automaticallyAdjustsScrollViewInsets = NO;

बस।


अद्भुत समाधान। एक जादू की तरह काम किया। क्या यह मेरे ViewController के बाकी दृश्यों के आकार को प्रभावित करेगा? (बटन, लेबल ..) मेरा मतलब है, "स्व" मेरे मामले में एक UIViewController है
voghDev

@voghDev नहीं, आपके स्क्रॉलव्यू में सबव्यू का कोई प्रभाव नहीं है।
मिरको ब्रूनर

आश्चर्यजनक मेरे विचार नियंत्रकों पर viewdidload पद्धति में इसे जोड़ रहा था जो समस्याएँ थीं।
स्टैकरनर

अगर आप नेवीगेशनकंट्रोलर का उपयोग कर रहे हैं और आपका स्क्रॉलव्यू नेविगेशनबार के शीर्षक के पीछे है जैसे कि व्यूडीडलड विधि के तहत मेरा उपयोग। यह हल करती है।
ईएफई

1
आप बिना किसी लाइन के सीधे स्टोरीबोर्ड सेटिंग्स में ही इसे प्राप्त कर सकते हैं। बस स्क्रॉल दृश्य नियंत्रक का चयन करें और विशेषता निरीक्षक में "स्क्रॉल स्क्रॉल इनसेट समायोजित करें" को अनचेक करें।
मोरफियस Mor२२

49

हाँ, pt2ph8 का उत्तर सही है,

लेकिन अगर किसी अजीब कारण से आपकी सामग्री UIScrollView से अधिक होनी चाहिए, तो आप UIScrollView प्रोटोकॉल विधि को लागू करने वाले ऊर्ध्वाधर स्क्रॉल को अक्षम कर सकते हैं

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

बस इसे अपने UIViewController में जोड़ें

float oldY; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
    // or if you are sure you wanna it always on top:
    // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}

उपयोगकर्ता द्वारा आपके UIScrollView को स्क्रॉल करने पर यह केवल विधि कहलाती है, और ऐसा करने से आप इसकी सामग्री को हमेशा समान रखते हैं।


6
परमेश्वर! कृपया float oldY;उपरोक्त कोड की तरह पुरानी। चर फ़ाइल को घोषित न करें । यह एक सी-स्टाइल वैरिएबल सिंबल है प्रति एप्लिकेशन के लिए, वेरिएबल MUST को कंट्रोलर क्लास के उदाहरण सदस्य के रूप में घोषित किया जाना चाहिए।
इताची

21

निम्न विधि शामिल करें

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

और स्क्रॉल दृश्य की चौड़ाई के बराबर स्क्रॉल दृश्य की सामग्री आकार चौड़ाई सेट करें।


1
यह स्टोरीबोर्ड में व्यू कंट्रोलर का चयन करके और वहाँ की संपत्ति को अनचेक करने के लिए भी किया जा सकता है
21

1
मुझे यह पसंद नहीं है क्योंकि यह इसे सभी स्क्रॉल दृश्यों के लिए सेट करता है ... काश आप आरेख पर एक स्क्रॉल दृश्य के लिए विशिष्ट हो सकते हैं w / o एक नया स्क्रॉल दृश्य वर्ग आदि बना रहा है
visc

20

आपको किस दिशा में चाहिए यह अक्षम करने के लिए आपको सामग्री आकार में 0 पास करना होगा।

ऊर्ध्वाधर स्क्रॉलिंग को अक्षम करने के लिए

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);

क्षैतिज स्क्रॉलिंग को अक्षम करने के लिए

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);

1
यह आपके द्वारा सेट की गई धुरी पर 0 के दृश्य की सामग्री को सेट करेगा। ContentSize सामग्री के आकार की बात कर रहा है, इसलिए हम उस फ़्रेम से परे लंबवत स्क्रॉलिंग को अक्षम करने के लिए स्क्रीन की ऊंचाई में पास करना चाहते हैं। सही के रूप में चिह्नित समाधान, सही है।
प्रणाली

इसने मेरे लिए अच्छा काम किया। सामग्री के रूप में ऊंचाई सेट करना अभी भी मुझे ऊर्ध्वाधर स्क्रॉलिंग मिली है।
कोरियनएक्सकोडवर्कर

1
इसने मेरे लिए काम नहीं किया। इसके अलावा self.automaticallyAdjustsScrollViewInsets
StackRunner

यह बात है! स्क्रॉल दृश्य की ऊँचाई पर सेट करना मेरे लिए काम नहीं करता था, लेकिन इसने किया
Echizzle

18

मैंने ऊर्ध्वाधर स्क्रॉलिंग को अक्षम करने के लिए सामग्री आकार को अपडेट किया, और स्क्रॉल करने की क्षमता अभी भी बनी हुई है। फिर मुझे पता चला कि मुझे पूरी तरह से स्क्रॉल को अक्षम करने के लिए, ऊर्ध्वाधर उछाल को भी अक्षम करने की आवश्यकता है।

शायद इस समस्या वाले लोग भी हैं।


तुमने मुझे बचाया। मेरी सामग्री और फ्रेम एक समान थे और मैं अपने जीवन के लिए यह पता नहीं लगा सका कि क्या गलत था। बहुत बहुत धन्यवाद!!
युफ

2
आपका जवाब है कि मुझे स्टैकओवरफ़्लो क्यों पसंद है! :-) पवित्र धुआँ ... यह मुझे पागल कर दिया! तुम सही हो। यह उछाल प्रभाव है। मैं उछाल प्रभाव चाहता हूं, लेकिन जब स्क्रॉल करने की कोई आवश्यकता नहीं होती है, तो मैं कोड में अब उस प्रभाव को अक्षम / फिर से सक्षम करना चाहूंगा कि क्या स्क्रॉल करने की आवश्यकता है।
एरिक वैन डेर नीट

2
ठीक है, रन-टाइम पर UIScrollView पर बाउंस को सक्षम / अक्षम करना बहुत आसान है। मेरे मामले में मैं केवल स्क्रॉल सामग्री की ऊंचाई के बारे में परवाह करता हूं और इसने यह चाल चली: self.scrollView.bounce = (BOOL) (self.scrollView.contentSize.height> self.scrollView.frame.size.height);
एरिक वैन डेर नीट

12
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

आपने पुष्टि की होगी UIScrollViewDelegate

aScrollView.delegate = self;

4

बस y को हमेशा शीर्ष पर रखें। UIScrollViewDelegate के साथ अनुरूप होना चाहिए

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

यह स्क्रॉलिंग के डिक्लेरेशन / एक्सेलेरेशन प्रभाव को बनाए रखेगा।


4

IOS 11 पर कृपया निम्नलिखित जोड़ने के लिए याद रखें, यदि आप एक स्क्रॉलव्यू बनाने में रुचि रखते हैं जो एक सुरक्षित कंपनी के बजाय स्क्रीन सीमा से चिपक जाता है।:

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

1
आख़िरकार। धन्यवाद हजार बार सर! आपने मेरा दिन बचाया
ha100

0

से iOS11 एक निम्नलिखित संपत्ति का उपयोग कर सकते

let frameLayoutGuide: UILayoutGuide

आप के लिए बाधाओं को सेट करते हैं frameLayoutGuide.topAnchor और frameLayoutGuide.bottomAnchor कुछ का एक ही एंकर को subview अपने की scrollview तो लंबवत स्क्रॉल अक्षम कर दिया जाएगा और की ऊंचाई scrollview अपने subview की ऊंचाई के बराबर हो जाएगा।


0

सबसे स्पष्ट समाधान आपके उपवर्ग में y- समन्वय परिवर्तनों को रोकना है।

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

स्थितियों में यह एकमात्र उपयुक्त समाधान है:

  1. आपको अनुमति नहीं है या आप केवल प्रतिनिधि का उपयोग नहीं करना चाहते हैं।
  2. आपकी सामग्री की ऊँचाई कंटेनर की ऊँचाई से बड़ी है

0

बहुत सारे उत्तरों में contentOffset0. से सेटिंग शामिल है। मेरे पास एक ऐसा मामला था जिसमें मैं स्क्रॉलव्यू के अंदर का दृश्य केंद्रित करना चाहता था। इसने मेरे लिए काम किया:

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.