ইউআইটিএবলভিউ আইফোনে নীচে স্ক্রোল করলে কীভাবে জানবেন


101

আমি জানতে চাই যে যখন UITableViewআরও কন্টেন্ট লোড করতে এবং দেখানোর জন্য কোনও নীচে স্ক্রোল করেছিল তখন কোনও প্রতিনিধি বা টেবিলে নীচে স্ক্রোল করার সময় নিয়ন্ত্রণকারীকে অন্য কিছু জানাতে হবে।

কেউ কি এটি জানেন, দয়া করে আমাকে সহায়তা করুন, অগ্রিম ধন্যবাদ!

উত্তর:


19

সর্বোত্তম উপায় হ'ল পর্দার নীচে একটি পয়েন্ট পরীক্ষা করা এবং যখন ব্যবহারকারী স্ক্রল করে (তখন scrollViewDidScroll) এই পদ্ধতি কলটি ব্যবহার করুন :

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point

স্ক্রিনের নীচের দিকে একটি বিন্দু পরীক্ষা করুন এবং তারপরে ইনডেক্সপথটি ব্যবহার করে এটি পরীক্ষা করে দেখায় যে সূচকটি যদি শেষ সারি হয় তবে যদি এটি হয় তবে সারি যুক্ত করুন।


দুর্ভাগ্যক্রমে যে আমার অ্যাপ্লিকেশনটি এই টেবিলের বিদ্যমান সারিগুলির জন্য রিয়েল টাইম ডেটা আপডেট করবে, সুতরাং যখন টেবিলটি মোটেও স্ক্রোল না হয় তখন এই উপায়ে আরও বেশি সামগ্রী পাওয়া যায়।
পুত্র এনগুইন

247

টেবিলভিউ প্রতিনিধিতে এই জাতীয় কিছু করুন

ওবিজেসি:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    // NSLog(@"offset: %f", offset.y);   
    // NSLog(@"content.height: %f", size.height);   
    // NSLog(@"bounds.height: %f", bounds.size.height);   
    // NSLog(@"inset.top: %f", inset.top);   
    // NSLog(@"inset.bottom: %f", inset.bottom);   
    // NSLog(@"pos: %f of %f", y, h);

    float reload_distance = 10;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
    }
}

দ্রুত:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offset = scrollView.contentOffset
    let bounds = scrollView.bounds
    let size = scrollView.contentSize
    let inset = scrollView.contentInset
    let y = offset.y + bounds.size.height - inset.bottom
    let h = size.height
    let reload_distance:CGFloat = 10.0
    if y > (h + reload_distance) {
        print("load more rows")
    }
}

ভাল! কেবলমাত্র ব্যবহার করুন: y> = এইচ + পুনরায় লোড_দুরত্ব, যা পুনরায় লোড_মিস্টেশন = 0 (যেমন, কোনও বাউন্সের জন্য নয়) কেবল তখনই উদ্বেগ।
ক্রিস প্রিন্স

4
"স্ক্রোলভিউডিডসক্রোল" -র এই কোডটি সর্বদা কার্যকর করা হচ্ছে ব্যবহারকারী আঙ্গুলটি স্ক্রিনে উপরে / নিচে সরান। এটিকে "স্ক্রোলভিউডিডইনডিজিটারেটিং" এর অধীনে সরিয়ে নেওয়া ভাল। যখন ব্যবহারকারী তার আঙুল চালানো বন্ধ করে দেয় তখন এটি কার্যকর করা হবে।
মিশা

হুম .. এই কোডটি এখনও কাজ করে? আমার জন্য ইউআইটিএলভিউয়ের নীচে পাচ্ছি না। আমি আশা করি উপরের সমস্ত কোডের পিছনে যুক্তিটি আমি জানতাম যাতে আমি সংশোধন করতে পারি
ফ্লোইউআই। সিম্পলইউটিস্টিং ডটকম 26'16

অফসেট: 237.000000 content.height: 855.000000 bounds.height: 667.000000 inset.top: 64.000000 inset.bottom: 49.000000 POS: 855.000000 এর 855.000000 যদি মিথ্যা হচ্ছে
অভিষেক Thapliyal

62

পরিবর্তিত নিউনিস কিছুটা উত্তর দেয়।

এই উত্তরটি আপনার মধ্যে যারা লক্ষ্য করে কেবল আঙুলটি প্রকাশের পরে ইভেন্টটি ট্রিগার করা উচিত ।

কিছু সামগ্রী সরবরাহকারী (ওয়েব পরিষেবা, মূল ডেটা ইত্যাদি) থেকে বেশি সামগ্রী লোড করার সময় উপযুক্ত। নোট করুন যে এই পদ্ধতির আপনার ওয়েব পরিষেবা থেকে প্রতিক্রিয়া সময় সম্মান করে না।

- (void)scrollViewDidEndDragging:(UIScrollView *)aScrollView
                  willDecelerate:(BOOL)decelerate
{
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;

    float reload_distance = 50;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
    }
}

এটি কাজ করে না। যখনই ব্যবহারকারী নীচে স্ক্রোল করে, "আরও বেশি সারি লোড করুন" ডাকা হয়। এটি ইতিমধ্যে ঘটে যখন ব্যবহারকারী ইতিমধ্যে নীচে স্ক্রোল করেছেন এবং এপিআইয়ের ডেটা প্রত্যাবর্তনের জন্য অপেক্ষা করছেন।
ডিন

4
ডিন, প্রশ্নটি যখন টেবিলের দৃশ্যটি নীচে স্ক্রোল করে তা জানার বিষয়ে ছিল। আপনি কোনও এপিআই থেকে ডেটা আনছেন বা অপ্রাসঙ্গিক নয়, তাই না?
আইবলবল

তবে লোড বেশি দেখাচ্ছে এমন কোনও বার্তা নেই .. যাতে ব্যবহারকারীর সচেতন হতে পারে যে আরও ফলাফল দেখানোর আছে।
আইফোন 7

আমার ক্ষেত্রে এটির উত্তম উত্তর কাজ করছে যদি: ফ্লোট রিলোড_ডেসিশন = 10; যদি (y> ​​(h - পুনরায় লোড_দূরত্ব)) {এনএসএলগ (@ "আরও সারি লোড করুন"); } কারণ y = 565 এবং h এছাড়াও 565
অভিষেক থাপলিয়াল

4
আমি আইবোল এবং @neoneye এর উত্তর উভয়ই চেষ্টা করেছি .আপনি 'স্ক্রোলভিউডিডএন্ডড্র্যাগিং'-এর তুলনায় একাধিকবার' স্ক্রোলভিউডিডস্রোকল 'না বলে আমাকে মুক্তি দিন। সুতরাং এটিতে আমার কাছে এপিআই কল রয়েছে বলে 'স্ক্রোলভিউডিডএন্ডড্র্যাগিং' ব্যবহার করা দক্ষ।
বিনোদ সুপোনেকার

39

এই পদ্ধতিটি যুক্ত করুন UITableViewDelegate:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{   
    CGFloat height = scrollView.frame.size.height;

    CGFloat contentYoffset = scrollView.contentOffset.y;

    CGFloat distanceFromBottom = scrollView.contentSize.height - contentYoffset;

    if(distanceFromBottom < height) 
    {
        NSLog(@"end of the table");
    }
}

4
আমি এই সমাধানটি একটি ছোট বিবরণ বাদে পছন্দ করি। যদি (দূরত্বফ্রোমবটম <= উচ্চতা)
মার্ক ম্যাককর্কল

এটি আমার সমস্যা সমাধানে আমাকে সহায়তা করেছে, আপনাকে ধন্যবাদ !! একটি ট্যাব বার !! এটি একটি নির্বোধ ট্যাব বার ছিল !!
Dmytro

এই কাজটি কবজির মতো, এবং এটি খুব সহজ, তবে আমি একটি ছোট সমস্যার মুখোমুখি হচ্ছি যেমন এটি শেষ সারিতে দুটি বা তিনবার কার্যকর করা হচ্ছে। যখন এটি টেবিলভিউয়ের শেষ সারিটিতে পৌঁছায় তখন এটি কেবলমাত্র একবার কার্যকর করা যায় কীভাবে?
আর মোহন

তোমাকে অনেক ধন্যবাদ!! আমি এই কোডটি স্ক্রোলভিউবিবেগিনডিজিটারেটিংয়ে রেখেছি এবং শেষ সারিতে স্ক্রোল করলে এটি একবার কার্যকর হয়।
মানালি

20

উপরের কোনও উত্তরই আমাকে সাহায্য করে না, তাই আমি এটি নিয়ে এসেছি:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)aScrollView
{   
    NSArray *visibleRows = [self.tableView visibleCells];
    UITableViewCell *lastVisibleCell = [visibleRows lastObject];
    NSIndexPath *path = [self.tableView indexPathForCell:lastVisibleCell];
    if(path.section == lastSection && path.row == lastRow)
    {
        // Do something here
    }
}

"লাস্ট সেকশন" কোথা থেকে এসেছে তা আপনি কী ব্যাখ্যা করতে পারেন?
আইনেসফৌর

এটি স্ক্রোল দেখার জন্য এবং সারণীতে নয়
iosMentalist

19

ব্যবহার – tableView:willDisplayCell:forRowAtIndexPath:( UITableViewDelegateপদ্ধতি)

সহজভাবে তুলনা করুন indexPathশেষ উপাদানটি প্রদর্শিত হচ্ছে কিনা তা নির্ধারণ করার জন্য কেবল আপনার ডেটা অ্যারের আইটেমগুলির সাথে (বা আপনার টেবিল দর্শনের জন্য আপনি যে কোনও ডেটা উত্স ব্যবহার করেন) সাথে ।

দস্তাবেজ: http://developer.apple.com/library/ios/docamentation/uikit/references/UITableViewDelegate_Protocol/References/References.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRathAtIndInd :


তারপরে, আপনি যদি টেবিলভিউ'র ডেটা পুনরায় লোড করেন তবে আপনি একটি অসীম লুপে আটকে যাবেন।
ডিলসন বিক্রয়

14

UITableViewএকটি উপশ্রেণী হয় UIScrollView, এবং UITableViewDelegateকে কনর্ফাম করে UIScrollViewDelegate। সুতরাং আপনি যে প্রতিনিধিটিকে টেবিলের দৃশ্যে সংযুক্ত করেন সেগুলি ইভেন্টগুলি পেতে scrollViewDidScroll:পারে এবং আপনি contentOffsetস্ক্রোলের অবস্থানটি সন্ধানের জন্য টেবিল ভিউয়ের মতো পদ্ধতিগুলিতে কল করতে পারেন ।


হ্যাঁ, আমি সেই প্রতিনিধিটিকে বাস্তবায়ন করে যাচ্ছি এবং স্ক্রোলের অবস্থানটি ইউআইটিএবল ভিউস্ক্রোল পজিশন নীচে রয়েছে কিনা তা পরীক্ষা করে জানব, আমি জানব যখন টেবিলটি নীচে স্ক্রোল হয়, তখন অনেক ধন্যবাদ
Son Nguyen

8
NSLog(@"%f / %f",tableView.contentOffset.y, tableView.contentSize.height - tableView.frame.size.height);

if (tableView.contentOffset.y == tableView.contentSize.height - tableView.frame.size.height)
        [self doSomething];

সুন্দর এবং সহজ


8

ভিতরে Swift এই মত কিছু করতে পারেন। প্রতিবার আপনি টেবিলভিউয়ের শেষে পৌঁছে গেলে নিম্নলিখিত শর্তটি সত্য হবে

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row+1 == postArray.count {
            println("came to last row")
        }
}

4
সমস্যাটি যখন টেবিলভিউতে কেবল 3 টি সেল থাকে উদাহরণস্বরূপ println("came to last row")এই কোডটি চালিত হয়!
ম্যাক.লভার

@ ম্যাক.লভার আমার পক্ষে হুবহু সমস্যা ছিল যার জন্য সিপিইউ ব্যবহার ছিল ৯২%। নিউয়ের উত্তর আমার পক্ষে কাজ করেছে। আপনার প্রয়োজন হলে আমি এটির জন্য দ্রুততম সংস্করণও যুক্ত করেছি।
অনুরাণ বর্মন

7

@ জয় মায়ুর উত্তরের উপর ভিত্তি করে তৈরি করা, যা আমি অনুভব করেছি যে এটি অন্যতম সেরা সমাধান:

উদ্দেশ্য গ

// UITableViewDelegate
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

// Need to call the service & update the array
if(indexPath.row + 1 == self.sourceArray.count) {
    DLog(@"Displayed the last row!");
  }
}

সুইফট 2.x

// UITableViewDelegate
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if (indexPath.row + 1) == sourceArray.count {
        print("Displayed the last row!")
    }
}

5

আমি সাধারণত সাধারণত আরও বেশি ডেটা লোড করতে এটি ব্যবহার করি, যখন শেষ ঘরটি প্রদর্শন শুরু হয় starts

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (indexPath.row ==  myDataArray.count-1) {
        NSLog(@"load more");
    }
}

4
এটা ভুল. আপনি যখনই পুনরায়লোডডাটা কল করবেন তখনই একটি অনুরোধ করা হবে। এবং কখনও কখনও আপনাকে কেবল টেবিলটি পুনরায় লোড করতে হবে।
প্যাট্রিক বাসুত

আপনি বলতে চেয়েছিলেন, যদি আপনার সর্বশেষ সেলে থাকে এবং তারপরে একটি পুনরায় লোড ডেটা তৈরি করে তবে এটি ঘটবে?
শায়িক রিয়াজ

5

টেকিং neoneye চমৎকার উত্তর কিন্তু দ্রুতগতি, এবং ভেরিয়েবল পুনঃনামকরনের ..

মূলত আমরা জানি yOffsetAtBottomযে টেবিলের সামগ্রীর উচ্চতার বাইরে যদি আমরা টেবিলের দৃশ্যের নীচে পৌঁছেছি ।

func isTableViewScrolledToBottom() -> Bool {
    let tableHeight = tableView.bounds.size.height
    let contentHeight = tableView.contentSize.height
    let insetHeight = tableView.contentInset.bottom

    let yOffset = tableView.contentOffset.y
    let yOffsetAtBottom = yOffset + tableHeight - insetHeight

    return yOffsetAtBottom > contentHeight
}

5

এখানে সুইফট version.০ সংস্করণ কোড রয়েছে।

   func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let offset = scrollView.contentOffset
        let bounds = scrollView.bounds
        let size = scrollView.contentSize
        let inset = scrollView.contentInset
        let y: Float = Float(offset.y) + Float(bounds.size.height) + Float(inset.bottom)
        let height: Float = Float(size.height)
        let distance: Float = 10

        if y > height + distance {
            // load more data
        }
    }

3

আমার সমাধানটি হ'ল কোষ যুক্ত করার আগে টেবিলভিউটি আনুমানিক অফসেটে হ্রাস পাবে। এটি বেগ দ্বারা অনুমানযোগ্য।

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)offset {

    NSLog(@"offset: %f", offset->y+scrollView.frame.size.height);
    NSLog(@"Scroll view content size: %f", scrollView.contentSize.height);

    if (offset->y+scrollView.frame.size.height > scrollView.contentSize.height - 300) {
        NSLog(@"Load new rows when reaches 300px before end of content");
        [[DataManager shared] fetchRecordsNextPage];
    }
}

3

সুইফট 3 এর জন্য আপডেট

নিওনির উত্তরটি আমার জন্য উদ্দেশ্য সিতে সবচেয়ে ভাল কাজ করেছে, এটি সুইফট 3-এ উত্তরটির সমতুল্য:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    let offset: CGPoint = scrollView.contentOffset
    let bounds: CGRect = scrollView.bounds
    let size: CGSize = scrollView.contentSize
    let inset: UIEdgeInsets = scrollView.contentInset
    let y: CGFloat = offset.y + bounds.size.height - inset.bottom
    let h: CGFloat = size.height
//        print("offset: %f", offset.y)
//        print("content.height: %f", size.height)
//        print("bounds.height: %f", bounds.size.height)
//        print("inset.top: %f", inset.top)
//        print("inset.bottom: %f", inset.bottom)
//        print("position: %f of %f", y, h)

    let reloadDistance: CGFloat = 10

    if (y > h + reloadDistance) {
            print("load more rows")
    }
}

2

আমি আমার যে কোনও 1 টি সম্পূর্ণ টেলভিউসেলটিতে কিছু পদক্ষেপ নিতে চাই।

সুতরাং কোডটি লিঙ্কটি হ'ল:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSArray* cells = self.tableView.visibleCells;
    NSIndexPath *indexPath = nil ;

    for (int aIntCount = 0; aIntCount < [cells count]; aIntCount++)
    {

        UITableViewCell *cell = [cells objectAtIndex:aIntCount];
CGRect cellRect = [self.tableView convertRect:cell.frame toView:self.tableView.superview];

        if (CGRectContainsRect(self.tableView.frame, cellRect))
        {
            indexPath = [self.tableView indexPathForCell:cell];

    //  remain logic
        }
     }
}

এটি কারওর পক্ষে সহায়তা হোক।


0

@ নিনির উত্তর আমার পক্ষে কাজ করেছে। এটির সুইফট 4 সংস্করণ এখানে

    let offset = scrollView.contentOffset
    let bounds = scrollView.bounds
    let size = scrollView.contentSize
    let insets = scrollView.contentInset
    let y = offset.y + bounds.size.height - insets.bottom
    let h = size.height
    let reloadDistance = CGFloat(10)
    if y > h + reloadDistance {
        //load more rows
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.