iPhone - यह जानना कि क्या UIScrollView ऊपर या नीचे तक पहुंचा है


86

क्या यह पता करने का कोई तरीका है कि UIScrollViewअंदर ऊपर या नीचे पहुंचा है या नहीं

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
                  willDecelerate:(BOOL)decelerate

?

धन्यवाद।

जवाबों:


199

UIScrollViewDelegateअपनी कक्षा में लागू करें , और फिर इसे जोड़ें:

-(void)scrollViewDidScroll: (UIScrollView*)scrollView
{
    float scrollViewHeight = scrollView.frame.size.height;
    float scrollContentSizeHeight = scrollView.contentSize.height;
    float scrollOffset = scrollView.contentOffset.y;

    if (scrollOffset == 0)
    {
        // then we are at the top
    }
    else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
    {
        // then we are at the end
    }
}

आशा है कि यह आप के बाद क्या है! उपरोक्त कोड में अधिक शर्तों को जोड़कर एलीस के पास एक टिंकर है और स्क्रॉलऑफ़सेट के मूल्य को NSLog करें।


4
यदि आप एक में हैं navigationController, तो आप इस तरह से कुछ और करना चाह सकते हैं: scrollOffset <= (0 - self.navigationController.navigationBar.frame.size.height - 20)और(scrollOffset + scrollHeight) >= scrollContentSizeHeight
वेन

समस्या यह है कि उछाल ... सब कुछ दो बार बुलाया जाता है एक बार ऊपर या नीचे तक पहुँच जाता है। क्या इसका कोई समाधान है, इसके अलावा टेबल या संग्रह दृश्य उछाल को बंद करने के लिए?
17

@denikov क्या आपने उसके लिए कोई समाधान खोजा?
प्रियाल

83

अच्छी तरह से contentInsetsशामिल हैं, जब आप यह निर्धारित करने की कोशिश करते हैं कि स्क्रॉलव्यू शीर्ष पर है या नीचे। तुम भी मामलों में रुचि हो सकती है जब आपके scrollview है ऊपर ऊपर और नीचे नीचे। यहां वह कोड है जिसका उपयोग मैं शीर्ष और निचले पदों को खोजने के लिए करता हूं:

स्विफ्ट:

extension UIScrollView {

    var isAtTop: Bool {
        return contentOffset.y <= verticalOffsetForTop
    }

    var isAtBottom: Bool {
        return contentOffset.y >= verticalOffsetForBottom
    }

    var verticalOffsetForTop: CGFloat {
        let topInset = contentInset.top
        return -topInset
    }

    var verticalOffsetForBottom: CGFloat {
        let scrollViewHeight = bounds.height
        let scrollContentSizeHeight = contentSize.height
        let bottomInset = contentInset.bottom
        let scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight
        return scrollViewBottomOffset
    }

}

उद्देश्य सी:

@implementation UIScrollView (Additions)

- (BOOL)isAtTop {
    return (self.contentOffset.y <= [self verticalOffsetForTop]);
}

- (BOOL)isAtBottom {
    return (self.contentOffset.y >= [self verticalOffsetForBottom]);
}

- (CGFloat)verticalOffsetForTop {
    CGFloat topInset = self.contentInset.top;
    return -topInset;
}

- (CGFloat)verticalOffsetForBottom {
    CGFloat scrollViewHeight = self.bounds.size.height;
    CGFloat scrollContentSizeHeight = self.contentSize.height;
    CGFloat bottomInset = self.contentInset.bottom;
    CGFloat scrollViewBottomOffset = scrollContentSizeHeight + bottomInset - scrollViewHeight;
    return scrollViewBottomOffset;
}


@end

यह अच्छा जवाब है, स्क्रॉलव्यूड्सक्रोल को लागू करना प्रदर्शन के लिए बुरा है
Vassily

3
स्क्रोलव्यूडीडक्रोल का उपयोग नहीं करने पर मैं इसे कैसे कह सकता हूं?
डेव जी।

2
फ़्लोटिंग पॉइंट मैथ की योनि की वजह से, मुझे 1879.05xxx का "वर्टिकलऑफ़्सेटफ़ोरबॉटम" मिल रहा था और स्विफ्ट 3 में नीचे होने पर मेरी कंटेंटऑफ़सेट 18 साल की थी। इसलिए मैं बदलकरreturn scrollViewBottomOffsetreturn scrollViewBottomOffset.rounded()
चैंबबैग

1
IOS 11 के रूप में safeAreaInsetsभी यह कारक है। scrollView.contentOffset.y + scrollView.bounds.height - scrollView.safeAreaInsets.bottom
InkGolem

36

यदि आप कोड को स्विफ्ट में चाहते हैं:

override func scrollViewDidScroll(scrollView: UIScrollView) {

    if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
        //reach bottom
    }

    if (scrollView.contentOffset.y <= 0){
        //reach top
    }

    if (scrollView.contentOffset.y > 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){
        //not top and not bottom
    }
}


4

मुझे लगा कि यह कैसे करना है:

CGFloat maxPosition = scrollView.contentInset.top + scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.bounds.size.height;
CGFloat currentPosition = scrollView.contentOffset.y + self.topLayoutGuide.length;

if (currentPosition == maxPosition) {
  // you're at the bottom!
}

0

इसे इस तरह करें (स्विफ्ट 3 के लिए):

class MyClass: UIScrollViewDelegate {

   func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
           //scrolled to top, do smth
        }


    }
}

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