UICollectionView current visible cell index
up vote
86
down vote
favorite
I am using UICollectionView
first time in my iPad application.
I have set UICollectionView
such that its size and cell size is same, means only once cell is displayed at a time.
Problem:
Now when user scroll UICollectionView I need to know which cell is visible I have to update other UI elements on change. I didn't find any delegate method for this. How can I achieve this?
Code:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
What I have tried:
As UICollectionView
Conforms to UIScrollView
, I got when user scroll ends with UIScrollViewDelegate
method
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
But inside above function how can I get current visible cell index of UICollectionView
???
ios objective-c ipad uicollectionview
add a comment |
up vote
86
down vote
favorite
I am using UICollectionView
first time in my iPad application.
I have set UICollectionView
such that its size and cell size is same, means only once cell is displayed at a time.
Problem:
Now when user scroll UICollectionView I need to know which cell is visible I have to update other UI elements on change. I didn't find any delegate method for this. How can I achieve this?
Code:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
What I have tried:
As UICollectionView
Conforms to UIScrollView
, I got when user scroll ends with UIScrollViewDelegate
method
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
But inside above function how can I get current visible cell index of UICollectionView
???
ios objective-c ipad uicollectionview
self.collectionViewFloors.indexPathsForVisibleItems
– Aznix
Oct 29 '16 at 12:07
add a comment |
up vote
86
down vote
favorite
up vote
86
down vote
favorite
I am using UICollectionView
first time in my iPad application.
I have set UICollectionView
such that its size and cell size is same, means only once cell is displayed at a time.
Problem:
Now when user scroll UICollectionView I need to know which cell is visible I have to update other UI elements on change. I didn't find any delegate method for this. How can I achieve this?
Code:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
What I have tried:
As UICollectionView
Conforms to UIScrollView
, I got when user scroll ends with UIScrollViewDelegate
method
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
But inside above function how can I get current visible cell index of UICollectionView
???
ios objective-c ipad uicollectionview
I am using UICollectionView
first time in my iPad application.
I have set UICollectionView
such that its size and cell size is same, means only once cell is displayed at a time.
Problem:
Now when user scroll UICollectionView I need to know which cell is visible I have to update other UI elements on change. I didn't find any delegate method for this. How can I achieve this?
Code:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
What I have tried:
As UICollectionView
Conforms to UIScrollView
, I got when user scroll ends with UIScrollViewDelegate
method
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
But inside above function how can I get current visible cell index of UICollectionView
???
ios objective-c ipad uicollectionview
ios objective-c ipad uicollectionview
asked Sep 6 '13 at 4:30
Irfan DANISH
4,81283155
4,81283155
self.collectionViewFloors.indexPathsForVisibleItems
– Aznix
Oct 29 '16 at 12:07
add a comment |
self.collectionViewFloors.indexPathsForVisibleItems
– Aznix
Oct 29 '16 at 12:07
self.collectionViewFloors.indexPathsForVisibleItems
– Aznix
Oct 29 '16 at 12:07
self.collectionViewFloors.indexPathsForVisibleItems
– Aznix
Oct 29 '16 at 12:07
add a comment |
15 Answers
15
active
oldest
votes
up vote
111
down vote
accepted
The method [collectionView visibleCells] give you all visibleCells array you want. Use it when you want to get
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.mainImageCollection visibleCells]) {
NSIndexPath *indexPath = [self.mainImageCollection indexPathForCell:cell];
NSLog(@"%@",indexPath);
}
}
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
9
ThescrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to thescrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).
– Samuel Spencer
Sep 16 '14 at 17:52
1
IIRC,..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.
– ToolmakerSteve
Jun 28 '16 at 12:39
4
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
|
show 2 more comments
up vote
132
down vote
indexPathsForVisibleItems
might work for most situations, but sometimes it returns an array with more than one index path and it can be tricky figuring out the one you want. In those situations, you can do something like this:
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
This works especially well when each item in your collection view takes up the whole screen.
Swift version
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
2
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
8
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
4
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
2
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
1
Excellent, but if the cells have a space between them thenvisibleIndexPath
sometimes will be nil, Soif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
|
show 6 more comments
up vote
62
down vote
Working Answers Combined In Swift 2.2 :
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = self.collectionView.contentOffset
visibleRect.size = self.collectionView.bounds.size
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath: NSIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
guard let indexPath = visibleIndexPath else { return }
print(indexPath)
}
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath)
}
add a comment |
up vote
16
down vote
For completeness sake, this is the method that ended up working for me. It was a combination of @Anthony & @iAn's methods.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
NSLog(@"%@",visibleIndexPath);
}
add a comment |
up vote
8
down vote
Just want to add for others :
for some reason, I didnt not get the cell that was visible to the user when I was scrolling to previous cell in collectionView with pagingEnabled.
So I insert the code inside dispatch_async to give it some "air"
and this works for me.
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_main_queue(), ^{
UICollectionViewCell * visibleCell= [[self.collectionView visibleCells] objectAtIndex:0];
[visibleCell doSomthing];
});
}
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
1
For Swift 4:DispatchQueue.main.async {
when call initiates from something likefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated fromwillDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.
– Jonny
Dec 26 '17 at 10:39
add a comment |
up vote
8
down vote
It will probably be best to use UICollectionViewDelegate methods: (Swift 3)
// Called before the cell is displayed
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
// Called when the cell is displayed
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
2
RegardingdidEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not thinkdidEndDisplaying
is called when the cell is displayed.
– Jonny
Dec 26 '17 at 10:49
add a comment |
up vote
7
down vote
For Swift 3.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: colView.contentOffset, size: colView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let indexPath = colView.indexPathForItem(at: visiblePoint)
}
add a comment |
up vote
5
down vote
Swift 3.0
Simplest solution which will give you indexPath for visible cells..
yourCollectionView.indexPathsForVisibleItems
will return the array of indexpath.
Just take the first object from array like this.
yourCollectionView.indexPathsForVisibleItems.first
I guess it should work fine with Objective - C as well.
add a comment |
up vote
2
down vote
You can use scrollViewDidEndDecelerating
: for this
//@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
NSLog(@"visible cell value %d",lastIndex);
}
}
add a comment |
up vote
2
down vote
UICollectionView current visible cell index: Swift 3
var visibleCurrentCellIndexPath: IndexPath? {
for cell in self.collectionView.visibleCells {
let indexPath = self.collectionView.indexPath(for: cell)
return indexPath
}
return nil
}
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
add a comment |
up vote
1
down vote
converting @Anthony's answer to Swift 3.0 worked perfectly for me:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = yourCollectionView.contentOffset
visibleRect.size = yourCollectionView.bounds.size
let visiblePoint = CGPoint(x: CGFloat(visibleRect.midX), y: CGFloat(visibleRect.midY))
let visibleIndexPath: IndexPath? = yourCollectionView.indexPathForItem(at: visiblePoint)
print("Visible cell's index is : (visibleIndexPath?.row)!")
}
add a comment |
up vote
0
down vote
This is old question but in my case...
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.firstObject].row;
}
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.lastObject].row;
}
add a comment |
up vote
0
down vote
Also check this snippet
let isCellVisible = collectionView.visibleCells.map { collectionView.indexPath(for: $0) }.contains(inspectingIndexPath)
add a comment |
up vote
0
down vote
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath[1])
}
If you want to show actual number than you can add +1
add a comment |
up vote
-1
down vote
try this, it works. (in the example below i have 3 cells for example.)
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size)
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
if let v = visibleIndexPath {
switch v.item {
case 0: setImageDescription()
break
case 1: setImageConditions()
break
case 2: setImageResults()
break
default: break
}
}
add a comment |
15 Answers
15
active
oldest
votes
15 Answers
15
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
111
down vote
accepted
The method [collectionView visibleCells] give you all visibleCells array you want. Use it when you want to get
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.mainImageCollection visibleCells]) {
NSIndexPath *indexPath = [self.mainImageCollection indexPathForCell:cell];
NSLog(@"%@",indexPath);
}
}
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
9
ThescrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to thescrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).
– Samuel Spencer
Sep 16 '14 at 17:52
1
IIRC,..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.
– ToolmakerSteve
Jun 28 '16 at 12:39
4
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
|
show 2 more comments
up vote
111
down vote
accepted
The method [collectionView visibleCells] give you all visibleCells array you want. Use it when you want to get
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.mainImageCollection visibleCells]) {
NSIndexPath *indexPath = [self.mainImageCollection indexPathForCell:cell];
NSLog(@"%@",indexPath);
}
}
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
9
ThescrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to thescrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).
– Samuel Spencer
Sep 16 '14 at 17:52
1
IIRC,..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.
– ToolmakerSteve
Jun 28 '16 at 12:39
4
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
|
show 2 more comments
up vote
111
down vote
accepted
up vote
111
down vote
accepted
The method [collectionView visibleCells] give you all visibleCells array you want. Use it when you want to get
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.mainImageCollection visibleCells]) {
NSIndexPath *indexPath = [self.mainImageCollection indexPathForCell:cell];
NSLog(@"%@",indexPath);
}
}
The method [collectionView visibleCells] give you all visibleCells array you want. Use it when you want to get
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.mainImageCollection visibleCells]) {
NSIndexPath *indexPath = [self.mainImageCollection indexPathForCell:cell];
NSLog(@"%@",indexPath);
}
}
answered Sep 6 '13 at 4:59
LE SANG
8,46475174
8,46475174
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
9
ThescrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to thescrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).
– Samuel Spencer
Sep 16 '14 at 17:52
1
IIRC,..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.
– ToolmakerSteve
Jun 28 '16 at 12:39
4
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
|
show 2 more comments
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
9
ThescrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to thescrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).
– Samuel Spencer
Sep 16 '14 at 17:52
1
IIRC,..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.
– ToolmakerSteve
Jun 28 '16 at 12:39
4
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
Can you please elaborate on where self.mainImageCollection comes from? Many thanx in advance for your further detail.
– Benjamin McFerren
Jun 1 '14 at 21:57
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
@BenjaminMcFerren it's the collectionview you used.
– LE SANG
Jun 2 '14 at 0:37
9
9
The
scrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to the scrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).– Samuel Spencer
Sep 16 '14 at 17:52
The
scrollViewDidScroll:
delegate method provides scroll view updates whenever any scroll finishes (and is probably a better choice here). As opposed to the scrollViewDidEndDecelerating:
delegate method which is only called when the scroll view "grinds to a halt [from a big scroll]" (see UIScrollView header).– Samuel Spencer
Sep 16 '14 at 17:52
1
1
IIRC,
..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.– ToolmakerSteve
Jun 28 '16 at 12:39
IIRC,
..DidScroll
gets called many times, even during a short scroll. May or may not be a good thing, depending on what one wants to do.– ToolmakerSteve
Jun 28 '16 at 12:39
4
4
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
Since iOS 10 it's now also possible to use indexPathsForVisibleItems directly :)
– Ben
Nov 7 '16 at 14:03
|
show 2 more comments
up vote
132
down vote
indexPathsForVisibleItems
might work for most situations, but sometimes it returns an array with more than one index path and it can be tricky figuring out the one you want. In those situations, you can do something like this:
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
This works especially well when each item in your collection view takes up the whole screen.
Swift version
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
2
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
8
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
4
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
2
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
1
Excellent, but if the cells have a space between them thenvisibleIndexPath
sometimes will be nil, Soif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
|
show 6 more comments
up vote
132
down vote
indexPathsForVisibleItems
might work for most situations, but sometimes it returns an array with more than one index path and it can be tricky figuring out the one you want. In those situations, you can do something like this:
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
This works especially well when each item in your collection view takes up the whole screen.
Swift version
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
2
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
8
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
4
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
2
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
1
Excellent, but if the cells have a space between them thenvisibleIndexPath
sometimes will be nil, Soif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
|
show 6 more comments
up vote
132
down vote
up vote
132
down vote
indexPathsForVisibleItems
might work for most situations, but sometimes it returns an array with more than one index path and it can be tricky figuring out the one you want. In those situations, you can do something like this:
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
This works especially well when each item in your collection view takes up the whole screen.
Swift version
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
indexPathsForVisibleItems
might work for most situations, but sometimes it returns an array with more than one index path and it can be tricky figuring out the one you want. In those situations, you can do something like this:
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
This works especially well when each item in your collection view takes up the whole screen.
Swift version
let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)
edited Jun 6 at 11:05
Arthur
6610
6610
answered Jun 24 '14 at 21:28
Anthony
4,41022542
4,41022542
2
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
8
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
4
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
2
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
1
Excellent, but if the cells have a space between them thenvisibleIndexPath
sometimes will be nil, Soif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
|
show 6 more comments
2
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
8
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
4
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
2
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
1
Excellent, but if the cells have a space between them thenvisibleIndexPath
sometimes will be nil, Soif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
2
2
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
This is great - thank you!
– mmackh
Sep 15 '14 at 11:55
8
8
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
I can agree, sometimes indexPathsForVisibleItems returns more cells, even if we think there shouldn't be such case. Your solution works great.
– MP23
Sep 17 '14 at 15:07
4
4
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
this is the most accurate code!
– Hashem Aboonajmi
Sep 23 '14 at 12:52
2
2
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
I was totally on this kind of situation, just one fix that worked for me (but my case was with tableview), I needed to change the CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect)); for CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMinY(visibleRect));
– JRafaelM
May 12 '15 at 16:22
1
1
Excellent, but if the cells have a space between them then
visibleIndexPath
sometimes will be nil, So if (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
Excellent, but if the cells have a space between them then
visibleIndexPath
sometimes will be nil, So if (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
– Husam
Jun 19 '15 at 17:19
|
show 6 more comments
up vote
62
down vote
Working Answers Combined In Swift 2.2 :
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = self.collectionView.contentOffset
visibleRect.size = self.collectionView.bounds.size
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath: NSIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
guard let indexPath = visibleIndexPath else { return }
print(indexPath)
}
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath)
}
add a comment |
up vote
62
down vote
Working Answers Combined In Swift 2.2 :
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = self.collectionView.contentOffset
visibleRect.size = self.collectionView.bounds.size
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath: NSIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
guard let indexPath = visibleIndexPath else { return }
print(indexPath)
}
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath)
}
add a comment |
up vote
62
down vote
up vote
62
down vote
Working Answers Combined In Swift 2.2 :
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = self.collectionView.contentOffset
visibleRect.size = self.collectionView.bounds.size
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath: NSIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
guard let indexPath = visibleIndexPath else { return }
print(indexPath)
}
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath)
}
Working Answers Combined In Swift 2.2 :
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = self.collectionView.contentOffset
visibleRect.size = self.collectionView.bounds.size
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath: NSIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
guard let indexPath = visibleIndexPath else { return }
print(indexPath)
}
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath)
}
edited Mar 22 at 19:20
Nik Kov
2,9762450
2,9762450
answered Apr 11 '16 at 12:44
Sam Bing
1,214820
1,214820
add a comment |
add a comment |
up vote
16
down vote
For completeness sake, this is the method that ended up working for me. It was a combination of @Anthony & @iAn's methods.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
NSLog(@"%@",visibleIndexPath);
}
add a comment |
up vote
16
down vote
For completeness sake, this is the method that ended up working for me. It was a combination of @Anthony & @iAn's methods.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
NSLog(@"%@",visibleIndexPath);
}
add a comment |
up vote
16
down vote
up vote
16
down vote
For completeness sake, this is the method that ended up working for me. It was a combination of @Anthony & @iAn's methods.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
NSLog(@"%@",visibleIndexPath);
}
For completeness sake, this is the method that ended up working for me. It was a combination of @Anthony & @iAn's methods.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};
CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));
NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];
NSLog(@"%@",visibleIndexPath);
}
edited Jun 12 '17 at 11:56
Meet Doshi
2,65282766
2,65282766
answered Sep 18 '14 at 13:06
Vincil Bishop
1,1411119
1,1411119
add a comment |
add a comment |
up vote
8
down vote
Just want to add for others :
for some reason, I didnt not get the cell that was visible to the user when I was scrolling to previous cell in collectionView with pagingEnabled.
So I insert the code inside dispatch_async to give it some "air"
and this works for me.
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_main_queue(), ^{
UICollectionViewCell * visibleCell= [[self.collectionView visibleCells] objectAtIndex:0];
[visibleCell doSomthing];
});
}
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
1
For Swift 4:DispatchQueue.main.async {
when call initiates from something likefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated fromwillDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.
– Jonny
Dec 26 '17 at 10:39
add a comment |
up vote
8
down vote
Just want to add for others :
for some reason, I didnt not get the cell that was visible to the user when I was scrolling to previous cell in collectionView with pagingEnabled.
So I insert the code inside dispatch_async to give it some "air"
and this works for me.
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_main_queue(), ^{
UICollectionViewCell * visibleCell= [[self.collectionView visibleCells] objectAtIndex:0];
[visibleCell doSomthing];
});
}
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
1
For Swift 4:DispatchQueue.main.async {
when call initiates from something likefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated fromwillDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.
– Jonny
Dec 26 '17 at 10:39
add a comment |
up vote
8
down vote
up vote
8
down vote
Just want to add for others :
for some reason, I didnt not get the cell that was visible to the user when I was scrolling to previous cell in collectionView with pagingEnabled.
So I insert the code inside dispatch_async to give it some "air"
and this works for me.
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_main_queue(), ^{
UICollectionViewCell * visibleCell= [[self.collectionView visibleCells] objectAtIndex:0];
[visibleCell doSomthing];
});
}
Just want to add for others :
for some reason, I didnt not get the cell that was visible to the user when I was scrolling to previous cell in collectionView with pagingEnabled.
So I insert the code inside dispatch_async to give it some "air"
and this works for me.
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
dispatch_async(dispatch_get_main_queue(), ^{
UICollectionViewCell * visibleCell= [[self.collectionView visibleCells] objectAtIndex:0];
[visibleCell doSomthing];
});
}
edited Mar 22 '15 at 10:24
answered Mar 21 '15 at 21:54
user1105951
1,91922144
1,91922144
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
1
For Swift 4:DispatchQueue.main.async {
when call initiates from something likefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated fromwillDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.
– Jonny
Dec 26 '17 at 10:39
add a comment |
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
1
For Swift 4:DispatchQueue.main.async {
when call initiates from something likefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated fromwillDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.
– Jonny
Dec 26 '17 at 10:39
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
This really helped! I didn't realized I can use dispatch_async block to make it absolutely flawless! This is the best answer!
– kalafun
Oct 20 '15 at 15:45
1
1
For Swift 4:
DispatchQueue.main.async {
when call initiates from something like func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
For Swift 4:
DispatchQueue.main.async {
when call initiates from something like func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
– Jonny
Dec 26 '17 at 10:33
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated from
willDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.– Jonny
Dec 26 '17 at 10:39
Some clarification: this helped me too, and I had the same/similar problem, when scrolling back to uitableviewcell containing a uicollectionview. The refresh call initiated from
willDisplay cell
as mentioned above. I think the problem, somewhere in UIKit, is really the same in my case as this answer.– Jonny
Dec 26 '17 at 10:39
add a comment |
up vote
8
down vote
It will probably be best to use UICollectionViewDelegate methods: (Swift 3)
// Called before the cell is displayed
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
// Called when the cell is displayed
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
2
RegardingdidEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not thinkdidEndDisplaying
is called when the cell is displayed.
– Jonny
Dec 26 '17 at 10:49
add a comment |
up vote
8
down vote
It will probably be best to use UICollectionViewDelegate methods: (Swift 3)
// Called before the cell is displayed
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
// Called when the cell is displayed
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
2
RegardingdidEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not thinkdidEndDisplaying
is called when the cell is displayed.
– Jonny
Dec 26 '17 at 10:49
add a comment |
up vote
8
down vote
up vote
8
down vote
It will probably be best to use UICollectionViewDelegate methods: (Swift 3)
// Called before the cell is displayed
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
// Called when the cell is displayed
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
It will probably be best to use UICollectionViewDelegate methods: (Swift 3)
// Called before the cell is displayed
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
// Called when the cell is displayed
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
print(indexPath.row)
}
answered Jun 20 '17 at 14:08
Mr Stanev
8081115
8081115
2
RegardingdidEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not thinkdidEndDisplaying
is called when the cell is displayed.
– Jonny
Dec 26 '17 at 10:49
add a comment |
2
RegardingdidEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not thinkdidEndDisplaying
is called when the cell is displayed.
– Jonny
Dec 26 '17 at 10:49
2
2
Regarding
didEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not think didEndDisplaying
is called when the cell is displayed.– Jonny
Dec 26 '17 at 10:49
Regarding
didEndDisplaying
, from the docs: Tells the delegate that the specified cell was removed from the collection view. Use this method to detect when a cell is removed from a collection view, as opposed to monitoring the view itself to see when it disappears. So I do not think didEndDisplaying
is called when the cell is displayed.– Jonny
Dec 26 '17 at 10:49
add a comment |
up vote
7
down vote
For Swift 3.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: colView.contentOffset, size: colView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let indexPath = colView.indexPathForItem(at: visiblePoint)
}
add a comment |
up vote
7
down vote
For Swift 3.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: colView.contentOffset, size: colView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let indexPath = colView.indexPathForItem(at: visiblePoint)
}
add a comment |
up vote
7
down vote
up vote
7
down vote
For Swift 3.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: colView.contentOffset, size: colView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let indexPath = colView.indexPathForItem(at: visiblePoint)
}
For Swift 3.0
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let visibleRect = CGRect(origin: colView.contentOffset, size: colView.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let indexPath = colView.indexPathForItem(at: visiblePoint)
}
edited May 17 '17 at 11:58
Varun Naharia
2,68442850
2,68442850
answered Jan 28 '17 at 12:23
Hiren Panchal
1,7491518
1,7491518
add a comment |
add a comment |
up vote
5
down vote
Swift 3.0
Simplest solution which will give you indexPath for visible cells..
yourCollectionView.indexPathsForVisibleItems
will return the array of indexpath.
Just take the first object from array like this.
yourCollectionView.indexPathsForVisibleItems.first
I guess it should work fine with Objective - C as well.
add a comment |
up vote
5
down vote
Swift 3.0
Simplest solution which will give you indexPath for visible cells..
yourCollectionView.indexPathsForVisibleItems
will return the array of indexpath.
Just take the first object from array like this.
yourCollectionView.indexPathsForVisibleItems.first
I guess it should work fine with Objective - C as well.
add a comment |
up vote
5
down vote
up vote
5
down vote
Swift 3.0
Simplest solution which will give you indexPath for visible cells..
yourCollectionView.indexPathsForVisibleItems
will return the array of indexpath.
Just take the first object from array like this.
yourCollectionView.indexPathsForVisibleItems.first
I guess it should work fine with Objective - C as well.
Swift 3.0
Simplest solution which will give you indexPath for visible cells..
yourCollectionView.indexPathsForVisibleItems
will return the array of indexpath.
Just take the first object from array like this.
yourCollectionView.indexPathsForVisibleItems.first
I guess it should work fine with Objective - C as well.
edited May 29 '17 at 5:11
answered May 29 '17 at 5:05
Anil Kukadeja
7711923
7711923
add a comment |
add a comment |
up vote
2
down vote
You can use scrollViewDidEndDecelerating
: for this
//@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
NSLog(@"visible cell value %d",lastIndex);
}
}
add a comment |
up vote
2
down vote
You can use scrollViewDidEndDecelerating
: for this
//@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
NSLog(@"visible cell value %d",lastIndex);
}
}
add a comment |
up vote
2
down vote
up vote
2
down vote
You can use scrollViewDidEndDecelerating
: for this
//@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
NSLog(@"visible cell value %d",lastIndex);
}
}
You can use scrollViewDidEndDecelerating
: for this
//@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
NSLog(@"visible cell value %d",lastIndex);
}
}
edited Oct 15 '14 at 13:39
answered Oct 15 '14 at 13:28
raaz
7,212195479
7,212195479
add a comment |
add a comment |
up vote
2
down vote
UICollectionView current visible cell index: Swift 3
var visibleCurrentCellIndexPath: IndexPath? {
for cell in self.collectionView.visibleCells {
let indexPath = self.collectionView.indexPath(for: cell)
return indexPath
}
return nil
}
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
add a comment |
up vote
2
down vote
UICollectionView current visible cell index: Swift 3
var visibleCurrentCellIndexPath: IndexPath? {
for cell in self.collectionView.visibleCells {
let indexPath = self.collectionView.indexPath(for: cell)
return indexPath
}
return nil
}
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
add a comment |
up vote
2
down vote
up vote
2
down vote
UICollectionView current visible cell index: Swift 3
var visibleCurrentCellIndexPath: IndexPath? {
for cell in self.collectionView.visibleCells {
let indexPath = self.collectionView.indexPath(for: cell)
return indexPath
}
return nil
}
UICollectionView current visible cell index: Swift 3
var visibleCurrentCellIndexPath: IndexPath? {
for cell in self.collectionView.visibleCells {
let indexPath = self.collectionView.indexPath(for: cell)
return indexPath
}
return nil
}
edited Mar 22 at 19:03
Nik Kov
2,9762450
2,9762450
answered Nov 24 '16 at 12:26
Mihail Salari
66249
66249
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
add a comment |
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
Best answer. Clean and a few lines.
– garanda
Dec 1 '16 at 8:45
add a comment |
up vote
1
down vote
converting @Anthony's answer to Swift 3.0 worked perfectly for me:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = yourCollectionView.contentOffset
visibleRect.size = yourCollectionView.bounds.size
let visiblePoint = CGPoint(x: CGFloat(visibleRect.midX), y: CGFloat(visibleRect.midY))
let visibleIndexPath: IndexPath? = yourCollectionView.indexPathForItem(at: visiblePoint)
print("Visible cell's index is : (visibleIndexPath?.row)!")
}
add a comment |
up vote
1
down vote
converting @Anthony's answer to Swift 3.0 worked perfectly for me:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = yourCollectionView.contentOffset
visibleRect.size = yourCollectionView.bounds.size
let visiblePoint = CGPoint(x: CGFloat(visibleRect.midX), y: CGFloat(visibleRect.midY))
let visibleIndexPath: IndexPath? = yourCollectionView.indexPathForItem(at: visiblePoint)
print("Visible cell's index is : (visibleIndexPath?.row)!")
}
add a comment |
up vote
1
down vote
up vote
1
down vote
converting @Anthony's answer to Swift 3.0 worked perfectly for me:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = yourCollectionView.contentOffset
visibleRect.size = yourCollectionView.bounds.size
let visiblePoint = CGPoint(x: CGFloat(visibleRect.midX), y: CGFloat(visibleRect.midY))
let visibleIndexPath: IndexPath? = yourCollectionView.indexPathForItem(at: visiblePoint)
print("Visible cell's index is : (visibleIndexPath?.row)!")
}
converting @Anthony's answer to Swift 3.0 worked perfectly for me:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = yourCollectionView.contentOffset
visibleRect.size = yourCollectionView.bounds.size
let visiblePoint = CGPoint(x: CGFloat(visibleRect.midX), y: CGFloat(visibleRect.midY))
let visibleIndexPath: IndexPath? = yourCollectionView.indexPathForItem(at: visiblePoint)
print("Visible cell's index is : (visibleIndexPath?.row)!")
}
answered May 10 '17 at 7:08
Nilesh Pol
6801925
6801925
add a comment |
add a comment |
up vote
0
down vote
This is old question but in my case...
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.firstObject].row;
}
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.lastObject].row;
}
add a comment |
up vote
0
down vote
This is old question but in my case...
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.firstObject].row;
}
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.lastObject].row;
}
add a comment |
up vote
0
down vote
up vote
0
down vote
This is old question but in my case...
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.firstObject].row;
}
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.lastObject].row;
}
This is old question but in my case...
- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.firstObject].row;
}
- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
_m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.lastObject].row;
}
answered May 23 '16 at 14:00
Hwangho Kim
392211
392211
add a comment |
add a comment |
up vote
0
down vote
Also check this snippet
let isCellVisible = collectionView.visibleCells.map { collectionView.indexPath(for: $0) }.contains(inspectingIndexPath)
add a comment |
up vote
0
down vote
Also check this snippet
let isCellVisible = collectionView.visibleCells.map { collectionView.indexPath(for: $0) }.contains(inspectingIndexPath)
add a comment |
up vote
0
down vote
up vote
0
down vote
Also check this snippet
let isCellVisible = collectionView.visibleCells.map { collectionView.indexPath(for: $0) }.contains(inspectingIndexPath)
Also check this snippet
let isCellVisible = collectionView.visibleCells.map { collectionView.indexPath(for: $0) }.contains(inspectingIndexPath)
answered May 22 at 7:37
Nik Kov
2,9762450
2,9762450
add a comment |
add a comment |
up vote
0
down vote
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath[1])
}
If you want to show actual number than you can add +1
add a comment |
up vote
0
down vote
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath[1])
}
If you want to show actual number than you can add +1
add a comment |
up vote
0
down vote
up vote
0
down vote
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath[1])
}
If you want to show actual number than you can add +1
Swift 3 & Swift 4:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }
print(indexPath[1])
}
If you want to show actual number than you can add +1
answered Nov 11 at 7:01
Jamil Hasnine Tamim
1,445820
1,445820
add a comment |
add a comment |
up vote
-1
down vote
try this, it works. (in the example below i have 3 cells for example.)
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size)
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
if let v = visibleIndexPath {
switch v.item {
case 0: setImageDescription()
break
case 1: setImageConditions()
break
case 2: setImageResults()
break
default: break
}
}
add a comment |
up vote
-1
down vote
try this, it works. (in the example below i have 3 cells for example.)
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size)
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
if let v = visibleIndexPath {
switch v.item {
case 0: setImageDescription()
break
case 1: setImageConditions()
break
case 2: setImageResults()
break
default: break
}
}
add a comment |
up vote
-1
down vote
up vote
-1
down vote
try this, it works. (in the example below i have 3 cells for example.)
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size)
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
if let v = visibleIndexPath {
switch v.item {
case 0: setImageDescription()
break
case 1: setImageConditions()
break
case 2: setImageResults()
break
default: break
}
}
try this, it works. (in the example below i have 3 cells for example.)
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size)
let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
let visibleIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
if let v = visibleIndexPath {
switch v.item {
case 0: setImageDescription()
break
case 1: setImageConditions()
break
case 2: setImageResults()
break
default: break
}
}
answered Nov 22 '16 at 5:21
Arash Jamshidi
5316
5316
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f18649920%2fuicollectionview-current-visible-cell-index%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
self.collectionViewFloors.indexPathsForVisibleItems
– Aznix
Oct 29 '16 at 12:07