I use UICollectionView
+ AFNetworking 2
for loading images asynchronously from a webservice. It's working great. However, how do I implement automatic scrolling (when user reaches bottom of page, or close to it, the API is called to fetch more cells).
I've seen lots of examples but there doesn't seem to be a best practice. For example, one tutorial suggested scrollViewDidScroll
, but that's called every time the view is scrolled. Is that the correct implementation?
PS. I'm coding in Swift.
Here's my cell creation code:
func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellIdentifier, forIndexPath: indexPath) as UICollectionViewCell
let offer = self.offers[indexPath.row]
var cellImageView = cell.viewWithTag(100) as UIImageView
let requestURL = NSURLRequest(URL: offer.largeImageURL)
cellImageView.setImageWithURLRequest(
requestURL,
placeholderImage:placeholderImage,
success: {
(request:NSURLRequest!, response:NSHTTPURLResponse!, image:UIImage!) in
cellImageView.image = image
},
failure: {
(request:NSURLRequest!, response:NSHTTPURLResponse!, error:NSError!) in
NSLog("GET Image Error: " + error.localizedDescription)
}
)
return cell
}
You could do it in a scrollViewDidScroll
delegate method or collectionView:cellForItemAtIndexPath:
(here you could detect that last cell is loading). What you would need to do is to create a wrapper for AFNetworking
call to prevent it from loading the data few times (some kind of flag that indicates that it's already loading).
After that you could insert additional cell with some kind of activity indicator at the bottom and remove it after AFNetworking
call is finished.
You should use the willEndDragging UIScrollview delegate method to determine where the scrollview will stop scrolling.
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
This has several advantages over the other methods:
In the willEndDragging, use the target content offset to determine if you need to load more results. Once your API has finished fetching data, simply call reloadData on the collection view and the new results will be shown. Note that the target contentOffset is a pointer, so you'll have to use targetContentOffset->y
to get the target y position.
The actual code to do this will be implementation dependent so I'm not putting in any sample, but it should be simple enough to code up.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With