Ios UIScrollView中的UIRefreshControl不';Don’我不会消失的
我试图在UIScrollView中使用UIRefreshControll,但我遇到了一个问题,需要多次滚动才能刷新它。我需要用双手来让它工作,所以我决定写一些滚动逻辑来开始刷新 现在的问题是,有时EndRefresh函数不会使UIRefreshControll视图消失,而我最终会永远将其保留在那里 我尝试在主队列中延迟调用endRefreshing,但它不起作用。我还尝试将isHidden设置为true,并将其从SuperView中移除。我没能成功Ios UIScrollView中的UIRefreshControl不';Don’我不会消失的,ios,swift,cocoa-touch,uiscrollview,uirefreshcontrol,Ios,Swift,Cocoa Touch,Uiscrollview,Uirefreshcontrol,我试图在UIScrollView中使用UIRefreshControll,但我遇到了一个问题,需要多次滚动才能刷新它。我需要用双手来让它工作,所以我决定写一些滚动逻辑来开始刷新 现在的问题是,有时EndRefresh函数不会使UIRefreshControll视图消失,而我最终会永远将其保留在那里 我尝试在主队列中延迟调用endRefreshing,但它不起作用。我还尝试将isHidden设置为true,并将其从SuperView中移除。我没能成功 import UIKit class Ref
import UIKit
class RefreshableView : UIView {
@IBOutlet weak var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
private var canRefresh = true
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = ColorName.grayColor.color
scrollView.refreshControl = refreshControl
}
func endRefreshing() {
self.refreshControl.endRefreshing()
}
}
extension RefreshableView: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y < -100 {
if canRefresh && !self.refreshControl.isRefreshing {
self.canRefresh = false
self.refreshControl.beginRefreshing()
self.refreshFunction?()
}
} else if scrollView.contentOffset.y >= 0 {
self.canRefresh = true
}
}
}
导入UIKit
类RefreshTableView:UIView{
@iBCROLLVIEW:UIScrollView!
私有let refreshControl=UIRefreshControl()
私有变量canRefresh=true
变量刷新函数:(()->())?
func setupUI(){
backgroundColor=ColorName.grayColor.color
scrollView.refreshControl=refreshControl
}
func endreshing(){
self.refreshControl.endRefreshing()
}
}
扩展刷新视图:UIScrollViewDelegate{
func scrollViewDidScroll(scrollView:UIScrollView){
如果scrollView.contentOffset.y<-100{
如果可以刷新&!self.refreshControl.isRefreshing{
self.canRefresh=false
self.refreshControl.beginRefreshing()
自我刷新功能()
}
}否则,如果scrollView.contentOffset.y>=0{
self.canRefresh=true
}
}
}
滚动视图的refreshControl
自动处理拉入刷新功能,因此您不需要任何scrollViewDidScroll()
代码
假设您的故事板看起来像这样,其中:
- 红色背景的视图是
类的一个实例RefreshableView
- 它包含一个滚动视图(通过
连接)@IBOutlet
- 滚动视图中的一些内容(这里我只有一个标签)
class RefreshableView : UIView {
@IBOutlet var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = .gray
refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
scrollView.refreshControl = refreshControl
}
@objc func didPullToRefresh() {
print("calling refreshFunction in controller")
self.refreshFunction?()
}
func endRefreshing() {
print("end refreshing called from controller")
self.refreshControl.endRefreshing()
}
}
class RefreshTestViewController: UIViewController {
@IBOutlet var theRefreshableView: RefreshableView!
override func viewDidLoad() {
super.viewDidLoad()
theRefreshableView.setupUI()
theRefreshableView.refreshFunction = {
print("simulating refresh for 2 seconds...")
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
[weak self] in
guard let self = self else { return }
// do what you want to update the contents of theRefreshableView
// ...
// then tell theRefreshableView to endRefreshing
self.theRefreshableView.endRefreshing()
}
}
}
}
滚动视图的
refreshControl
自动处理拉入刷新功能,因此您不需要任何scrollViewDidScroll()
代码
假设您的故事板看起来像这样,其中:
- 红色背景的视图是
类的一个实例RefreshableView
- 它包含一个滚动视图(通过
连接)@IBOutlet
- 滚动视图中的一些内容(这里我只有一个标签)
class RefreshableView : UIView {
@IBOutlet var scrollView: UIScrollView!
private let refreshControl = UIRefreshControl()
var refreshFunction: (() -> ())?
func setupUI() {
backgroundColor = .gray
refreshControl.addTarget(self, action: #selector(didPullToRefresh), for: .valueChanged)
scrollView.refreshControl = refreshControl
}
@objc func didPullToRefresh() {
print("calling refreshFunction in controller")
self.refreshFunction?()
}
func endRefreshing() {
print("end refreshing called from controller")
self.refreshControl.endRefreshing()
}
}
class RefreshTestViewController: UIViewController {
@IBOutlet var theRefreshableView: RefreshableView!
override func viewDidLoad() {
super.viewDidLoad()
theRefreshableView.setupUI()
theRefreshableView.refreshFunction = {
print("simulating refresh for 2 seconds...")
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
[weak self] in
guard let self = self else { return }
// do what you want to update the contents of theRefreshableView
// ...
// then tell theRefreshableView to endRefreshing
self.theRefreshableView.endRefreshing()
}
}
}
}
谢谢最初我尝试了这个解决方案,但我的问题是我在interface builder中设置了scrollview的高度,这使得使用默认实现很难实现。当我在IB中将viewcontrollers simulated size更改为freeform以设计我的contentview时,我在scrollview上获得了这个高度。我不知道这会影响运行时的视图。谢谢。最初我尝试了这个解决方案,但我的问题是我在interface builder中设置了scrollview的高度,这使得使用默认实现很难实现。当我在IB中将viewcontrollers simulated size更改为freeform以设计我的contentview时,我在scrollview上获得了这个高度。我不知道这会影响运行时的视图。