वर्तमान पृष्ठ प्राप्त करना


97

मेरे स्क्रॉल दृश्य में, मैं वह वर्तमान पृष्ठ प्राप्त करना चाहता हूं जिसे प्रदर्शित किया जा रहा है (शायद पृष्ठ सही शब्द नहीं है)। मुझे ऐसा कोई चर नहीं मिल रहा है जो इसे धारण करता हो। लेकिन मुझे लगता है कि इसे कहीं न कहीं रखा जाना चाहिए, क्योंकि सूचक यह दिखाने में सक्षम है कि वर्तमान में स्क्रॉल दृश्य के कौन से उप-दृश्य प्रदर्शित किए जा रहे हैं।

क्या यह हमसे पूरी तरह से छिपा है या मेरे लिए इसे एक्सेस करने का कोई तरीका है?

जवाबों:


263

UIScrollViewवर्तमान पृष्ठ के लिए कोई संपत्ति नहीं है। आप इसकी गणना कर सकते हैं:

int page = scrollView.contentOffset.x / scrollView.frame.size.width;

यदि आप निकटतम पृष्ठ के ऊपर या नीचे चक्कर लगाना चाहते हैं, तो उपयोग करें:

CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;

7
UIScrollViewDelegateउपयोगकर्ता स्क्रॉल करने पर वर्तमान पृष्ठ प्राप्त करने के लिए उपयोग करना न भूलें !
सैम स्पेंसर

रोटेशन से निपटने के दौरान यह समस्या हो सकती है।
जेसन मैकक्रेरी

कृपया स्विफ्ट संस्करण जोड़ें
fnc12

1
यह हमेशा काम नहीं करता है, कभी-कभी फ्रेम की चौड़ाई गलत होती है।
रोड्रिगो रुइज़

यह हमेशा काम नहीं करता है। कभी-कभी मुझे पेज 0 के रूप में मिल रहा है जो मेरे मामले में गलत है।
स्नेहा

32

मैं आपको इस कोड का उपयोग करने की सलाह देता हूं

int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;

लेकिन यदि आप इस कोड का उपयोग करते हैं तो आपके दृश्य को उस पृष्ठ पर होना आवश्यक नहीं है जो indexOfPage आपको देता है। यह इसलिए है क्योंकि मैं आपको केवल इस विधि में इस कोड का उपयोग करने की सलाह देता हूं

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}

जिसे तब स्क्रॉल किया जाता है जब आपका स्क्रॉल दृश्य समाप्त हो जाता है और आपके पृष्ठ की संख्या वास्तव में तेज होती है

मैं आपको इस कोड के साथ अपने स्क्रॉल दृश्य को सक्षम करने के लिए सेट करने की सलाह देता हूं

[scrollView setPagingEnabled:YES];

तो आखिरकार इसे इस तरह से देखना चाहिए

-(void) methodWhereYouSetYourScrollView
{
   //set scrollView
   [scrollView setPagingEnabled:YES];
   scrollView.delegate = self;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
   int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
   //your stuff with index
}

iOS7 डिवाइस पर काम नहीं कर रहा है (XCODE 6.2 के साथ संकलित) contentOffset.x, 640 के बजाय 639 के बराबर होता है (मुझे क्यों नहीं पूछें ...) जब स्क्रॉलव्यूडएंडडेलरेटिंग। user363349 उत्तर सही है: रिटर्न फ्लोर ((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
वासली

यह हमेशा काम नहीं करता है। कभी-कभी मुझे पेज 0 के रूप में मिल रहा है जो मेरे मामले में गलत है।
स्नेहा

30

तेजी से मैं इसे विस्तार में करूंगा:

extension UIScrollView {
    var currentPage:Int{
        return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
    }
}

तो बस कॉल करें:

scrollView.currentPage

10
लगभग सही, मुझे अपनी दुनिया में सब कुछ शून्य होने के बाद से अंत में +1 को हटाना पड़ा
mvandillen

12

ऊपर के रूप में लेकिन एक श्रेणी के रूप में


@interface UIScrollView (CurrentPage)
-(int) currentPage;
@end
@implementation UIScrollView (CurrentPage)
-(int) currentPage{
    CGFloat pageWidth = self.frame.size.width;
    return floor((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
}
@end

6
यह ओवरडोन है, बस रिटर्न राउंड का उपयोग करें (self.contentOffset.x / self.frame.size. उपलब्धता); बहुत सरल और समझने में आसान ..
लियोनार्ड पौली

-1 @ लियोनार्डपौली। उपरोक्त कार्यान्वयन उस पृष्ठ को लौटाता है जो 50% से अधिक दिखाई देता है। स्क्रॉलिंग के सबव्यू पूरे स्क्रॉलव्यू सीमा पर रहने पर भोली कार्यान्वयन केवल पृष्ठ मान को बदलता है।
यूजर

1
@user सबसे पहले, फर्श () राउंड हमेशा नीचे, और राउंड () राउंड अप होता है अगर दशमलव भाग> = 5, और नीचे है। उसके द्वारा कहा जा रहा है, मंजिल (ए) = दौर (ए-0.5)। चलो कुछ सरल बीजगणित करते हैं। मंजिल (अब / 2) / बी) +1 = मंजिल (ए / बी-0.5) +1 = दौर (/ ए / 0.5-0.5) +1 = दौर (ए / बी -1) +1 = गोल ( एक / ख)। देखो! यह फर्श की तरह लगता है ((ab / 2) / b) +1 = राउंड (a / b)! Mathemagical।
लियोनार्ड पाउली

लेकिन हाँ, अगर मैं किसी कारण के बजाय फर्श का इस्तेमाल किया होता, तो आप बिल्कुल सही होते! ;)
लियोनार्ड पाउली

8

दूसरा तरीका :

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let width = scrollView.frame.width
        let page = Int(round(scrollView.contentOffset.x/width))
        print("CurrentPage:\(page)")
    }
}

6

बस पृष्ठ आकार द्वारा वर्तमान ऑफसेट को विभाजित करें:

CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);

11
इंट को कास्टिंग करना और फिर फ्लोट को असाइन करना? ); क्यों नहीं साथ ही pageNum पूर्णांक बनाना
क्लास

6

यहाँ पहले से ही कुछ अच्छे उत्तर हैं। हालांकि, ऐसे परिदृश्यों के लिए जहां सामग्री एक पृष्ठ में बिल्कुल फिट नहीं होती है - और अगर मेरी तरह आप परिणाम के लिए उपयोग करना चाहते हैं UIPageControl, तो ceilफ़ंक्शन का उपयोग करना आवश्यक है ।

आइए एक उदाहरण लेते हैं जहां मेरे पास सामग्री के "चार और एक बिट" पृष्ठ हैं।

मैं इसे अपने वर्तमान वास्तविक जीवन उदाहरण पर आधारित करूँगा। सामग्री का आकार चौड़ाई 3140 अंक है। मेरे संग्रह दृश्य फ़्रेम आकार के आधार पर, पृष्ठ की चौड़ाई 728 है।

इसलिए पृष्ठों की संख्या बराबर है:

 3140 / 728 = 4.313 

मेरा numberOfPagesपांच होने वाला है। जिनमें से चार संपूर्णता में दिखेंगे, और जिनमें से अंतिम - पृष्ठ पाँच - उस शेष 0.313सामग्री को दिखाएगा ।

अब, numberOfPagesपांच होने का मतलब है कि पेज इंडेक्स 0, 1, 2, 3 और 4 होगा।

जब मैं दाईं ओर स्वाइप करता हूं, तो अंतिम ऑफसेट की ओर बढ़ते हुए scrollViewDidEndDecelerating विधि 2412 की अंतिम X ऑफसेट देती है।

गोलाई गणना लागू करना:

2412 / 728 = 3.313 then rounded = 3

यह गलत है। पृष्ठ उपयोगकर्ता ऑफसेट द्वारा देखा जाना चाहिए:

Offset / Page User Is Viewing
0        0
728      1
1456     2
2184     3
2412     4

सही गणना का उपयोग कर ceil:

private func pageForOffset(offset:CGFloat, pageWidth width:CGFloat) -> Int
{
    let page = Int(ceil(offset / width))
    NSLog("\(__FUNCTION__) offset \(offset) width \(width) page \(page) ")
    return page
}

4

स्विफ्ट के लिए मैं बस इसका इस्तेमाल करूंगा

    let width = scrollView.frame.width
    let page = round(scrollView.contentOffset.x/width)

बहुत सीधा, यह मूल रूप से स्क्रॉलव्यू एक्स स्थिति लेता है, इसे स्क्रॉलव्यू चौड़ाई से विभाजित करता है, फिर इसे गोल करता है।


3

XCode में 7.x स्विफ्ट 2.x आप कर सकते हैं:

//MARK: - ScrollView Extensions
// Get the current page number
extension UIScrollView {
    var currentPage: Int {
        return Int(round(self.contentOffset.x / self.bounds.size.width))
    }

// If you have reversed offset (start from contentSize.width to 0)
    var reverseCurrentPage: Int {
        return Int(round((contentSize.width - self.contentOffset.x) / self.bounds.size.width))-1
    }
}

3

Aoakenfo का समाधान अद्भुत है, यह फ़ंक्शन कोड के साथ अपने कोड को स्क्रॉल करने का एक और समाधान है स्क्रॉलडायस्कॉल और पेजकंट्रोलर

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    if (sender == self.scroll) {
        int pageNum = (int)(self.scrPage.contentOffset.x / self.scrPage.frame.size.width);
        self.pagecontroller.currentPage =pageNum;
    }
}

1
यह लालची है, आलसी नहीं ... यह MVC भी नहीं है। बहुत सरल तरीका स्क्रॉल पर करंटपेज को अमान्य करना है, और इसे केवल तभी सेट करें जब यह अनुरोध किया जाए ... UIScrollView पर एक उपवर्ग या श्रेणी से सभी

2

मैंने इसे हमारे ऐप्स के एक जोड़े से निकाला है ...

- (NSInteger)currentPage
{
    if (0 == self.frame.size.width) {
        NSLog(@"frame width == 0!");
        return 0;
    }
    if (! self.currentPageValid) {
        _currentPage = round(self.contentOffset.x / self.frame.size.width);
        self.currentPageValid = YES;
    }
    return _currentPage;
}

पूर्ण स्रोत यहाँ


1

क्या आप UIPageControl का उपयोग कर रहे हैं? यदि हां, तो इसके पास एक currentPageसंपत्ति है। यदि नहीं, तो मुझे लगता है कि आपको स्क्रॉल दृश्य ऑफसेट से पेज इंडेक्स की गणना करने की आवश्यकता होगी।


0

यदि कोई Xamarin के लिए C # करने के तरीके की तलाश कर रहा है

    public int CurrentIndex
    {
        get => (int)Math.Round(this.scrollView.ContentOffset.X / this.scrollView.Frame.Width);
        set => this.scrollView.ScrollRectToVisible(new CGRect(new CGPoint(this.scrollView.Frame.Size.Width * value, 0), this.scrollView.Frame.Size), true);
    }

यह गेटटर और सेटर आपको वर्तमान पृष्ठ प्रदान करना चाहिए और साथ ही आपको निर्दिष्ट पृष्ठ पर स्क्रॉल करने देना चाहिए


0

स्विफ्ट 5.1+ UIScrollView एक्सटेंशन (रिटर्न कीवर्ड को स्वीकार करते हुए)

extension UIScrollView {

    var currentPage: Int {
        Int(round(self.contentOffset.x / self.frame.width))
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.