বর্তমান পৃষ্ঠা পেতে


98

আমার স্ক্রোল ভিউতে, আমি যে বর্তমান পৃষ্ঠাটি প্রদর্শিত হচ্ছে তা পেতে চাই (সম্ভবত পৃষ্ঠাটি সঠিক শব্দ নয়)। এটি ধারণ করে এমন কোনও ভেরিয়েবল আমি খুঁজে পাচ্ছি না। তবে আমি মনে করি এটি অবশ্যই কোথাও অনুষ্ঠিত হবে, যেহেতু সূচকটি বর্তমানে স্ক্রোল ভিউয়ের কোন উপ-দৃশ্য প্রদর্শিত হচ্ছে তা দেখাতে সক্ষম।

এটি কি আমাদের কাছ থেকে সম্পূর্ণ লুকিয়ে আছে বা আমার কাছে এটি অ্যাক্সেস করার কোনও উপায় আছে?

উত্তর:


264

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

4
এটি সবসময় কাজ করে না, কখনও কখনও ফ্রেমের প্রস্থটিও ভুল।
রডরিগো রুইজ

এটি সবসময় কাজ করে না। কখনও কখনও পৃষ্ঠাটি 0 হিসাবে পাচ্ছি যা আমার ক্ষেত্রে ভুল।
স্নেহা

32

আমি আপনাকে এই কোডটি ব্যবহার করার পরামর্শ দিচ্ছি

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

তবে আপনি যদি এই কোডটি ব্যবহার করেন তবে আপনার ভিউ সূচিপত্রের যে পৃষ্ঠায় আপনাকে দেয় ঠিক তেমনটি হওয়ার দরকার নেই। কারণ আমি আপনাকে এই কোডটি কেবল এই পদ্ধতিতে ব্যবহার করার পরামর্শ দিচ্ছি

-(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 সহ সংকলিত) কন্টেন্টঅফসেট.এক্স 640 এর পরিবর্তে 639 এর সমান (আমাকে কেন জিজ্ঞাসা করবেন না ...) যখন স্ক্রোলভিউডিডএন্ডডিলিটারেটর করছে তখন। user363349 উত্তর সঠিক: ফেরত মেঝে ((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
ভ্যাসিলি

এটি সবসময় কাজ করে না। কখনও কখনও পৃষ্ঠাটি 0 হিসাবে পাচ্ছি যা আমার ক্ষেত্রে ভুল।
স্নেহা

31

দ্রুতগতিতে আমি এটি এক্সটেনশনে করব:

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.width); বোঝার জন্য আরও সহজ এবং সহজ ..
লিওনার্ড পাওলি

-1 @ লিওনার্ডপৌলি। উপরোক্ত প্রয়োগটি 50% এরও বেশি দৃশ্যমান পৃষ্ঠাটি প্রদান করে। নিষ্কলুষ বাস্তবায়ন তখনই পৃষ্ঠার মান পরিবর্তন করে যখন স্ক্রোলভিউয়ের সাবভিউ পুরো স্ক্রোলভিউয়ের সীমানা দখল করে।
ব্যবহারকারী

4
@ ব্যবহারকারীর প্রথমত, তল () রাউন্ডটি সর্বদা নিচে থাকে এবং দশমিক অংশটি = = 5 থাকলে অন্যদিকে নীচে ()) বৃত্তাকার হয়। বলা হচ্ছে, তল (ক) = বৃত্তাকার (এ-0.5)। আসুন কিছু সাধারণ বীজগণিত করা যাক। তল ((ab / 2) / খ) +1 = তল (a / b-0.5) +1 = বৃত্তাকার (a / b-0.5-0.5) +1 = বৃত্তাকার (a / b-1) +1 = বৃত্তাকার ( ক / খ)। দেখো! মনে হচ্ছে মেঝে ((ab / 2) / খ) +1 = বৃত্তাকার (a / b)! গাণিতিক
লিওনার্ড পাওলি

তবে হ্যাঁ, আমি যদি কোনও কারণে এর পরিবর্তে মেঝেটি ব্যবহার করতাম তবে আপনি পুরোপুরি ঠিকই থাকতেন! ;)
লিওনার্ড পাওলি

9

অন্য উপায় :

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

7

ইতিমধ্যে এখানে কিছু ভাল উত্তর আছে। যাইহোক, পরিস্থিতিগুলির জন্য যেখানে সামগ্রী কোনও পৃষ্ঠায় হুবহু খাপ খায় না - এবং যদি আমার মতো আপনি ফলাফলটি a UIPageControlএর জন্য ব্যবহার করতে চান তবে ceilফাংশনটি ব্যবহার করা এটি প্রয়োজনীয় ।

আসুন একটি উদাহরণ নেওয়া যাক যেখানে আমার কাছে সামগ্রীর "চার এবং কিছুটা" পৃষ্ঠা রয়েছে।

আমি এটি আমার বর্তমান বাস্তব জীবনের উদাহরণের ভিত্তিতে করব। সামগ্রীর আকারের প্রস্থ 3140 পয়েন্ট। আমার সংগ্রহ ভিউ ফ্রেমের আকারের উপর ভিত্তি করে পৃষ্ঠার প্রস্থ 728।

পৃষ্ঠাগুলির সমান সংখ্যা:

 3140 / 728 = 4.313 

আমার numberOfPagesপাঁচ বছর হতে চলেছে। এর মধ্যে চারটি সম্পূর্ণরূপে প্রদর্শিত হবে, এবং এর মধ্যে সর্বশেষ - পাঁচ পৃষ্ঠায় - বাকিটি প্রদর্শন করবে0.313 অংশটি প্রদর্শিত হবে।

এখন, numberOfPages পাঁচটি হওয়ার অর্থাত্ পৃষ্ঠা সূচকগুলি 0, 1, 2, 3 এবং 4 হবে।

আমি যখন ডানদিকে সোয়াইপ করি তখন চূড়ান্ত অফসেটের দিকে পেজিং করি the scrollViewDidEndDecelerating পদ্ধতিটি 2412 এর একটি চূড়ান্ত এক্স অফসেট দেয়।

বৃত্তাকার গণনা প্রয়োগ করা:

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
}

6

কেবলমাত্র বর্তমান অফসেটটিকে পৃষ্ঠার আকার দ্বারা ভাগ করুন:

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

11
ইনট এ কাস্টিং এবং তারপরে কোনও ফ্লোট বরাদ্দ করা হচ্ছে? পৃষ্ঠাগুলিও পাশাপাশি কেন তৈরি করবেন না;)
ক্লাস

4

অওকেনফোর সমাধানটি আশ্চর্যজনক, এটি আপনার কোডটি ফাংশন স্ক্রোলভিউডিডস্রোকল এবং পেজকন্ট্রোলারের সাথে একত্রিত করা অন্য সমাধান is

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

4
এটি লোভী, অলস নয় ... এটি এমভিসিও নয়। একটি সহজ সরল উপায় হ'ল বর্তমান পৃষ্ঠাটি স্ক্রোলটিতে অবৈধ করা, এবং কেবল অনুরোধ করা হলে এটি সেট করা ... সমস্তগুলি ইউআইএসক্রোলভিউতে একটি সাবক্লাস বা বিভাগ থেকে

4

দ্রুততার জন্য আমি এটি ব্যবহার করব

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

বেশ সোজা, এটি মূলত স্ক্রোলভিউ এক্স অবস্থান নেয়, এটিকে স্ক্রোলভিউয়ের প্রস্থ অনুসারে ভাগ করে, তারপরে এটি বৃত্তাকার করে।


3

এক্সকোড x.x সুইফট ২.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
    }
}

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

আপনি কি কোনও ইউআইপেজকন্ট্রোল ব্যবহার করছেন? যদি তা হয় তবে এর একটি currentPageসম্পত্তি আছে। যদি তা না হয় তবে আমি মনে করি আপনাকে স্ক্রোলভিউ অফসেট থেকে পৃষ্ঠা সূচি গণনা করতে হবে।


0

যদি কেউ Xamarin এর জন্য সি # তে উপায় খুঁজছেন

    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+ ইউআইএসক্রোলভিউ এক্সটেনশন (রিটার্ন কীওয়ার্ড ছাড়ছে)

extension UIScrollView {

    var currentPage: Int {
        Int(round(self.contentOffset.x / self.frame.width))
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.