शीर्ष पर स्क्रॉल करने के लिए UIScrollView प्राप्त करें


जवाबों:


316

IOS 7 के लिए अद्यतन

[self.scrollView setContentOffset:
    CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];

मूल

[self.scrollView setContentOffset:CGPointZero animated:YES];

या यदि आप क्षैतिज स्क्रॉल स्थिति को संरक्षित करना चाहते हैं और केवल ऊर्ध्वाधर स्थिति को रीसेट करते हैं:

[self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, 0)
    animated:YES];

50
यदि आप iOS 7 के लिए ऐसा कर रहे हैं, तो आपको UIScrollView contentInsetदुर्भाग्य से ध्यान में रखना होगा । [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];मेरे लिए काम करता है
रनमाड

11
मैं नेविगेशन और स्थिति पट्टी के ठीक नीचे शीर्ष पर स्क्रॉल करने में सक्षम था। [scrollView setContentOffset:CGPointMake(0, -scrollView.contentInset.top) animated:YES];यह iOS 6 & 7 में काम करता है
Amozoss

यह मेरे लिए काम नहीं कर रहा था, शायद इसलिए कि मैं स्प्राइट किट में एक उल्टे दृश्य के साथ कुछ पागल कर रहा हूं। लेकिन अगर कोई और भी मेरे जैसा पागल है - और आपका [scrollView setContentOffset:CGPointMake(0, scrollView.contentSize.height-scrollView.frame.size.height) animated:YES];
स्क्रॉलव्यू

देर से आने वाली टिप्पणी: आपको ओएस संस्करण की परवाह किए बिना सामग्री इनसेट के लिए समायोजित करना चाहिए। iOS 7 स्थिति पट्टी के नीचे स्क्रॉल सामग्री की अनुमति देने के लिए इसका उपयोग करने के लिए होता है, लेकिन इसे हमेशा एक संपत्ति के रूप में उजागर किया जाता है, इसलिए हमेशा किसी के द्वारा संभावित रूप से उपयोग किया जाता है।
टॉमी

2
IOS 11+ के लिए, Jakub Truhlář का नीचे दिया गया जवाब समायोजितकंटेंटसेट का उपयोग करने में मददगार था, कम से कम मेरे मामले में।
tnv

61

यहां एक स्विफ्ट एक्सटेंशन है जो इसे आसान बनाता है:

extension UIScrollView {
    func scrollToTop() {
        let desiredOffset = CGPoint(x: 0, y: -contentInset.top)
        setContentOffset(desiredOffset, animated: true)
   }
}

उपयोग:

myScrollView.scrollToTop()

40

iOS 11 और ऊपर

नए के साथ काम करने की कोशिश करें adjustedContentInset

उदाहरण के लिए (शीर्ष पर स्क्रॉल करें):

var offset = CGPoint(
    x: -scrollView.contentInset.left, 
    y: -scrollView.contentInset.top)

if #available(iOS 11.0, *) {
    offset = CGPoint(
        x: -scrollView.adjustedContentInset.left, 
        y: -scrollView.adjustedContentInset.top)    
}

scrollView.setContentOffset(offset, animated: true)

भले ही आप उपयोग करें prefersLargeTitles, safe areaआदि।




17

स्विफ्ट 2.0 / 3.0 / 4.0 और iOS 7+ के लिए उत्तर:

let desiredOffset = CGPoint(x: 0, y: -self.scrollView.contentInset.top)
self.scrollView.setContentOffset(desiredOffset, animated: true)

8

IOS7 में मुझे शीर्ष पर जाने के लिए एक विशेष स्क्रॉलव्यू प्राप्त करने में परेशानी हुई, जिसने iOS6 में काम किया, और शीर्ष पर जाने के लिए स्क्रॉलव्यू को सेट करने के लिए इसका उपयोग किया।

[self.myScroller scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

IOS7 में भी मेरा यही मुद्दा है। क्या किसी को पता है कि इसे यूआईटेबल व्यू के लिए कैसे सक्षम किया जाए?
DZenBot

1
यह अजीब है कि यह कैसे काम करता है जब एनिमेटेड NO है, लेकिन जब एनिमेटेड YES नहीं है। यदि हाँ, तो यह लगभग शीर्ष पर स्क्रॉल करता है 1617
मैट बेकर


2

पूरी तरह से स्थिति बार स्क्रॉलटॉप व्यवहार को दोहराने के लिए हमें न केवल कंटेंटऑफसेट सेट करना होगा बल्कि यह भी सुनिश्चित करना होगा कि स्क्रॉलइंडिकेटर्स प्रदर्शित हों। अन्यथा उपयोगकर्ता जल्दी से खो सकता है।

इसे पूरा करने का एकमात्र सार्वजनिक तरीका है flashScrollIndicators। दुर्भाग्य से, सामग्री को सेट करने के बाद एक बार कॉल करने से ऑफीस का कोई प्रभाव नहीं पड़ता क्योंकि यह तुरंत रीसेट हो जाता है। मैंने पाया कि जब यह फ़्लैश हर बार काम करता है scrollViewDidScroll:

// define arbitrary tag number in a global constants or in the .pch file
#define SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG 19291

- (void)scrollContentToTop {
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, -self.scrollView.contentInset.top) animated:YES];

    self.scrollView.tag = SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.scrollView.tag = 0;
    });
}

अपने UIScrollViewDelegate (या UITable / UICollectionViewDelegate) में इसे लागू करें:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.tag == SCROLLVIEW_IS_SCROLLING_TO_TOP_TAG) {
        [scrollView flashScrollIndicators];
    }
}

स्टेटस बार स्क्रॉलटॉप व्यवहार की तुलना में छिपाने की देरी थोड़ी कम है लेकिन यह अभी भी अच्छा लग रहा है।

ध्यान दें कि मैं "ScrollingToTop "स्थिति को संप्रेषित करने के लिए व्यू टैग का दुरुपयोग कर रहा हूं क्योंकि मुझे व्यू कंट्रोलर्स में इसकी आवश्यकता है। यदि आप कुछ और के लिए टैग का उपयोग कर रहे हैं, तो आप इसे iVar या संपत्ति के साथ बदलना चाह सकते हैं।


मैंने परीक्षण नहीं किया है, लेकिन यदि आप इसके बजाय DISPATCH_TIME_NOW का उपयोग करते हैं, तो इसे अगले रनलूप पर फेंक देना चाहिए। इस काम को करने के लिए धन्यवाद, निश्चित रूप से मुझे इसकी आवश्यकता नहीं है, लेकिन यह जानना अच्छा है।
डैन रोसेनस्टार्क

यह कुछ समय पहले की बात है और मुझे ठीक से याद नहीं है लेकिन मेरा मानना ​​है कि यह काम नहीं किया। अगले रनलोप को जानिए आमतौर पर ऐसे मामलों में मैं पहली कोशिश करता हूं।
ऑर्टविन Gentz

2

मुझे लगता है कि मेरे पास एक उत्तर है जो आईओएस 11 के साथ-साथ पूर्व संस्करणों (ऊर्ध्वाधर स्क्रॉलिंग के लिए) पूरी तरह से संगत होना चाहिए

इस खाते में नए लेता adjustedContentInset और यह भी के लिए खातों अतिरिक्त आवश्यक जब ऑफसेट prefersLargeTitles navigationBar जो जो कुछ भी की डिफ़ॉल्ट है एक अतिरिक्त 52px शीर्ष पर ऑफसेट की आवश्यकता प्रतीत होता है पर सक्षम है

यह थोड़ा मुश्किल था क्योंकि एडिट स्टेट स्टेट (बड़े टाइटल बनाम छोटे टाइटल) के आधार पर एडजस्टेबल कांटेस्ट में बदलाव होता है, इसलिए मुझे यह देखने और देखने की जरूरत थी कि टाइटलर की ऊंचाई क्या है और बड़े राज्य में इसकी पहले से ही 52px ऑफसेट को लागू न करें। नेवीगेशन की स्थिति की जांच करने के लिए कोई अन्य तरीका नहीं खोज सका, अगर किसी के पास यह देखने से बेहतर विकल्प है कि क्या ऊंचाई है> 44.0 तो मैं इसे सुनना चाहता हूं

func scrollToTop(_ scrollView: UIScrollView, animated: Bool = true) {
    if #available(iOS 11.0, *) {
        let expandedBar = (navigationController?.navigationBar.frame.height ?? 64.0 > 44.0)
        let largeTitles = (navigationController?.navigationBar.prefersLargeTitles) ?? false
        let offset: CGFloat = (largeTitles && !expandedBar) ? 52: 0
        scrollView.setContentOffset(CGPoint(x: 0, y: -(scrollView.adjustedContentInset.top + offset)), animated: animated)
    } else {
        scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: animated)
    }
}

जकूब के समाधान से प्रेरित


2

जब आपका नेविगेशन बार स्क्रॉल दृश्य सामग्री के छोटे हिस्से को ओवरलैप करता है तो यह बहुत सामान्य है और ऐसा लगता है कि सामग्री शीर्ष से शुरू नहीं होती है। इसे ठीक करने के लिए मैंने 2 काम किए:

  • आकार इंस्पेक्टर - स्क्रॉल दृश्य - सामग्री इनसेट -> स्वचालित से कभी नहीं बदलें।
  • आकार निरीक्षक - बाधाएं- "ऊपर संरेखित करें" (शीर्ष संरेखण बाधाएं) - दूसरा आइटम -> Superview.Top से सुरक्षित क्षेत्र में बदलें। ऊपर और मान (स्थिर क्षेत्र) 0 पर सेट करें

सामग्री इंसेट - कभी नहीं ScrolView.Top को सुरक्षित क्षेत्र में संरेखित करें। ऊपर


1

पत्रिका के लिए शीर्ष पर UITableViewController, UICollectionViewControllerया किसी UIViewControllerके होनेUIScrollView

extension UIViewController {

  func scrollToTop(animated: Bool) {
    if let tv = self as? UITableViewController {
        tv.tableView.setContentOffset(CGPoint.zero, animated: animated)
    } else if let cv = self as? UICollectionViewController{
        cv.collectionView?.setContentOffset(CGPoint.zero, animated: animated)
    } else {
        for v in view.subviews {
            if let sv = v as? UIScrollView {
                sv.setContentOffset(CGPoint.zero, animated: animated)
            }
        }
    }
  }
}


-4

मैंने सभी तरह से कोशिश की। लेकिन मेरे लिए कुछ भी काम नहीं किया। अंत में मुझे यह पसंद आया।

मैंने self.view .addSubview(self.scroll)viewDidLoad में कोड की लाइन जोड़ी । स्क्रॉल दृश्य के लिए फ्रेम सेट करना शुरू करने और दृश्य स्क्रॉल करने के लिए घटकों को जोड़ा।

इसने मेरे लिए काम किया।

सुनिश्चित करें कि आपने self.view .addSubview(self.scroll)शुरुआत में लाइन जोड़ी थी। तब आप UI तत्व जोड़ सकते हैं।


कृपया इसे हटा दें। हालांकि यह निश्चित रूप से उस समय समझ में आता है, आपके सबव्यू पदानुक्रम मुद्दे इस प्रश्न के लिए प्रासंगिक नहीं हैं।
डैन रोसेनस्टार्क

1
@ क्रिटिक यदि आपका स्क्रॉल दृश्य पदानुक्रम में नहीं है, या आपका कंप्यूटर बंद है, तो निश्चित रूप से इसमें से कोई भी काम नहीं करेगा। लेकिन ओपी ने कुछ बहुत ही संकीर्ण तरीके से पूछा
डैन रोसेनस्टार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.