Reputation: 814
i have my refreshcontroller
with a scrollview
..
self.refreshControl = UIRefreshControl()
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)")
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.scrollView.addSubview(refreshControl)
func refresh(sender:AnyObject)
{
//my refresh code here..
self.refreshControl.endRefreshing()
}
I'm adding as a subview
to a scrollView
. It's working when the page content is overflowing
the screen. but the issue arise when i haven't received much data and it's not overflowing
, the pull and refresh
function is not working. :(
I'm not using tableview
.
Can anybody help me how to solve this problem?
Upvotes: 8
Views: 16114
Reputation: 490
Yes We can use refresh control to UIScrollView, UITableview, UicollectionVIew..
Here is the code for PULL TO REFRESH,
var refreshControl: UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.alwaysBounceVertical = true
scrollView.bounces = true
refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
self.scrollView.addSubview(refreshControl)
}
@objc func didPullToRefresh() {
print("Refersh")
// For End refrshing
refreshControl?.endRefreshing()
}
Upvotes: 9
Reputation: 48514
alwaysBounceVertical
is not entirely true, and refreshControl
has been introduced:
bounces
is always required if contentSize
is smaller than frame
alwaysBounceVertical
is also required for small contentUIScrollView
of the existence of a UIRefreshControl
using refreshControl
UIRefreshControl
is now supported by UIScrollView
, using refreshControl
just like UITableView
in previous OS.
This means that the drag & pull down experience, is flawless, without drift.
Follow the tap + drag on the white arrow in the animation below: they stay in sync
You can add a UIRefreshControl
manually to a UIScrollView
, but that view has no awareness of such an element, and the pull to refresh tends to drift.
Notice how much harder it is to pull to refresh on the animation below: scrolling of the white arrow drifts, and requires a much greater distance to trigger the control
Bypass refreshControl
OS discrepancies with this scroll view extension
:
var _refreshControl : UIRefreshControl? {
get {
if #available(iOS 10.0, *) {
return refreshControl
} else {
return subviews.first(where: { (view: UIView) -> Bool in
view is UIRefreshControl
}) as? UIRefreshControl
}
}
set {
if #available(iOS 10.0, *) {
refreshControl = newValue
} else {
// Unique instance of UIRefreshControl added to subviews
if let oldValue = _refreshControl {
oldValue.removeFromSuperview()
}
if let newValue = newValue {
insertSubview(newValue, at: 0)
}
}
}
}
► Find this solution on GitHub.
Upvotes: 11
Reputation: 264
This UIRefreshControl is not supposed to work for UIScrollView. It is supposed to be linked with a table through an associated table view controller object.
Note: Because the refresh control is specifically designed for use in a table view that's managed by a table view controller, using it in a different context can result in undefined behavior.
UIRefreshControl Class Reference
Upvotes: 0
Reputation: 1152
self.scrollView.scrollEnabled = true
self.scrollView.alwaysBounceVertical = true
var alwaysBounceVertical: Bool // default NO. if YES and bounces is YES, even if content is smaller than bounds, allow drag vertically
Upvotes: 11