UIRefreshControl with UICollectionView in iOS7
Having the same problem and found a workaround that seems to fix it.
This seems to be happening because the UIScrollView
is slowing down the tracking of the pan gesture when you pull past the edge of the scrollview. However, UIScrollView
is not accounting for changes to contentInset during tracking. UIRefreshControl
changes contentInset when it activates, and this change is causing the jump.
Overriding setContentInset
on your UICollectionView
and accounting for this case seems to help:
- (void)setContentInset:(UIEdgeInsets)contentInset {
if (self.tracking) {
CGFloat diff = contentInset.top - self.contentInset.top;
CGPoint translation = [self.panGestureRecognizer translationInView:self];
translation.y -= diff * 3.0 / 2.0;
[self.panGestureRecognizer setTranslation:translation inView:self];
}
[super setContentInset:contentInset];
}
Interestingly, UITableView
accounts for this by NOT slowing down tracking until you pull PAST the refresh control. However, I don't see a way that this behavior is exposed.
UIRefreshControl on UICollectionView only works if the collection fills the height of the container
Try this:
self.collectionView.alwaysBounceVertical = YES;
Complete code for a UIRefreshControl
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
refreshControl.tintColor = [UIColor grayColor];
[refreshControl addTarget:self action:@selector(refershControlAction) forControlEvents:UIControlEventValueChanged];
[self.collectionView addSubview:refreshControl];
self.collectionView.alwaysBounceVertical = YES;
UIRefreshControl not centred with contentInset set
OK, fixed the problem by not setting collectionView.contentInset. Instead I set on the flowLayout
i.e.
flowLayout.sectionInset = UIEdgeInsetsMake(0, 20, 20, 20);
Pull to refresh in UICollectionView in ViewController
From the storyboard, you need to link the collection view to the appropriate controller file, using Ctrl + Drag from the collection view object. It needs to be linked via an @IBOutlet.
Also, you should Ctrl + Drag from the collection view to the view controller object on the storyboard and select Data Source and Delegate so that the collection view is correctly linked.
Let me know if this helps or if I have misunderstood your situation.
iOS7 UIRefreshControl changes contentInset
This is probably the reason why UIRefreshControl
is currently only supported on UITableViewController
, rather than by addition to any scrollview (which you can get away with, in many cases).
The refresh control does its magic by tinkering with the content insets of the scrollview - particularly when it ends refreshing. Unfortunately the view controller is also tinkering with the content insets of the scroll view to fit it under the translucent nav and status bars. Fun ensues. Is this also an issue on iOS 6 (or, "good old iOS6" as I called it when dealing with the same issue).
The quickest solution is probably to add your table view as a child UITableViewController instead of a simple subview. I think that UITableViewController manages the insets for you at the end of the refresh. If that doesn't work, I've got workarounds for this but it will have to wait until I get back in the office.
UIRefreshControl - Pull To Refresh in iOS 7
You do not have to explicitly set frame or start UIRefreshControl
. If it is a UITableView
or UICollectionView
, it should work like a charm by itself. You do need to stop it though.
Here is how you code should look like:
- (void)viewDidLoad {
[super viewDidLoad];
refreshControl = [[UIRefreshControl alloc]init];
[refreshControl addTarget:self action:@selector(refreshTable) forControlEvents:UIControlEventValueChanged];
if (@available(iOS 10.0, *)) {
self.mytableView.refreshControl = refreshControl;
} else {
[self.mytableView addSubview:refreshControl];
}
}
In your refreshTable
function, you need to stop it when you are done refreshing your data. Here is how it is going to look like:
- (void)refreshTable {
//TODO: refresh your data
[refreshControl endRefreshing];
[self.mytableView reloadData];
}
Please note that if you are refreshing your data asynchronously then you need to move endRefreshing
and reloadData
calls to your completion handler.
UICollectionView UIRefreshControl Doesn't Animate After Visiting a Different View
After completed loading You have to stop the refreshing
[tableView.refreshControl endRefreshing]
Hope its useful for you..:)
Related Topics
Swiftui - Animations Triggered Inside a View That's in a List Doesn't Animate the List as Well
Error: Uicollectionview Must Be Initialized with a Non-Nil Layout Parameter
How Programmatically Restart an iPhone App in iOS
Missing Marketing Icon Xcode Bug
Playing Back Audio Using Avaudioplayer iOS 7
Xcode UI Testing Error Keyboard
Tableview Cell How Do We Resize Cell in Swift Along with Image and Label
iOS 8 Uiactivityviewcontroller and Uialertcontroller Button Text Color Uses Window's Tintcolor
Hardware-Dependent Nsdateformatter Datefromstring: Bug (Returns Nil)
Swift - Error 'Expected ',' Separator' and 'Expected Expression in List of Expressions'
Swiftui Generic Pull to Refresh View
Alternative to Usernotificationcenterdelegate's Willpresent When App Is in Background
How to Send Multiple Parameterts to PHP Server in Http Post
Is Possible to Simulate Touch Event Using an External Keyboard on iOS Jailbroken
Want to Create a Cool Static UI But:"Static Table Views Are Only Valid..."