Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 喜欢大标题和刷新控件,但效果不好_Swift_Xcode_Uitableview_Uinavigationbar_Uirefreshcontrol - Fatal编程技术网

Swift 喜欢大标题和刷新控件,但效果不好

Swift 喜欢大标题和刷新控件,但效果不好,swift,xcode,uitableview,uinavigationbar,uirefreshcontrol,Swift,Xcode,Uitableview,Uinavigationbar,Uirefreshcontrol,我使用它来实现RefreshControl的拉入刷新行为。我正在使用导航栏。当使用普通标题时,一切都很好。但是,当使用“更喜欢大标题”时,它无法正常工作,正如您在以下视频中看到的那样。有人知道为什么吗?视频之间唯一的变化是“更喜欢大标题”上的情节提要检查 最后,对我有用的是: 要修复RefreshControl进度条消失的大标题错误,请执行以下操作: self.extendedLayoutIncludesOpaqueBars = true 要在refreshcontrol.endRefr

我使用它来实现
RefreshControl
的拉入刷新行为。我正在使用
导航栏
。当使用普通标题时,一切都很好。但是,当使用“更喜欢大标题”时,它无法正常工作,正如您在以下视频中看到的那样。有人知道为什么吗?视频之间唯一的变化是“更喜欢大标题”上的情节提要检查


最后,对我有用的是:

  • 要修复RefreshControl进度条消失的大标题错误,请执行以下操作:

    self.extendedLayoutIncludesOpaqueBars = true
    
  • 要在
    refreshcontrol.endRefresh()之后修复列表偏移量,请执行以下操作:


如果您使用的是
tableView.tableHeaderView=refreshControl
tableView.addSubView(refreshControl)
您应该尝试使用
tableView.refreshControl=refreshControl
我遇到了同样的问题,其他答案对我都不起作用

我意识到,将“表视图顶部”约束从“安全区域”更改为“超级视图”,修复了这个奇怪的旋转错误


此外,请确保该约束的常量值为0似乎有许多不同的原因可能导致这种情况发生,对我来说,我在ViewController中嵌入了一个TableView我使用0将tableview的顶部布局指南设置为superview。在所有这些之后,直到我将我的RefreshControl结束编辑打包到一个延迟块中,我仍然什么都没有:

DispatchQueue.main.async {
   if self.refreshControl.isRefreshing {
       DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
            self.refreshControl.endRefreshing()
       })
   }
}

使用XIBs对我有效的唯一解决方案是Bruno的一个:

但是,我不想使用XIB。为了通过使用AutoLayout编写代码来实现这一点,我做了很多努力

我终于找到了一个有效的解决方案:

override func loadView(){
super.loadView()
让tableView=UITableView()
//配置tableView
self.view=tableView
}

如果在UIViewController层次结构(如UITableViewController)中添加tableview或scroll view作为根视图,则问题可以解决


当customView是UITableView或UICollectionView时,我也有这个问题,我通过在stackView中嵌入我的scrollView(或tableView\collectionView)修复了它,重要的是这个stackView的顶部约束不会附加到safeArea视图(所有其他约束都可以)。顶部约束应该是连接到它的superview或其他视图。

我也遇到了同样的问题。在调用进一步的API之前调用refreshControl EndRefresh

refreshControl.addTarget(controller, action: #selector(refreshData(_:)), for: .valueChanged)

@objc func refreshData(_ refreshControl: UIRefreshControl) {
        refreshControl.endRefreshing()
        self.model.loadAPICall {
            self.tableView.reloadData()
        }
    }

对我来说,唯一可行的解决方案是结合以下代码行:


tableView.contentInsetAdjustmentBehavior=.always

很长一段时间以来,我一直面临着同样的问题,唯一可行的解决方案是在tableView的背景视图中添加刷新控件

tableView.backgroundView = refreshControl
简短回答 我通过延迟调用API直到集合视图停止减速来修复这个问题

长话短说 我注意到,当刷新控件结束刷新,而集合视图仍在向上移动到其原始位置时,就会出现问题。因此,我延迟进行API调用,直到我的集合视图停止移动,即停止减速。这里有一个逐步的步骤:

  • 跟随
  • 如果将导航栏的半透明值设置为false(
    navigationBar.isTranslucent=false
    ),则必须在视图控制器上设置
    ExtendedLayoutCludeSopaqueBars=true
    )。否则,跳过这个
  • 延迟api调用。由于我使用的是
    RxSwift
    ,下面是我的操作方法
  • collectionView.rx.didend正在减速
    .map{[unowned self]\在self.refreshControl.isRefreshing}
    .filter{$0==true}
    .subscribe(onNext:{uu}in
    //进行api调用
    })
    .处置(由:处置人)
    
  • API完成后,调用
  • refreshControl.endRefreshing()
    
    警告
    请注意,由于我们延迟了API调用,这意味着整个pull-to-refresh过程并没有在没有延迟的情况下完成的那么快。

    这有帮助吗?如果您有不透明的选项卡栏,并且self.extendedlayoutincludesopaquebar=true使所有内容都位于选项卡栏下,并且您不希望出现这种行为,那么您可以添加“self.edgesForExtendedLayout=uirectredge.top”第一部分帮助了我!在修复列表偏移量之前,请检查是否缺少对tableView.reloadData()的调用,例如,如果更新tableHeaderView,则应在更新之后立即调用reloadData()。从早上开始就一直在努力,这是唯一对我有效的解决方案(iOS 12.1)。谢谢也为我工作,有一周的时间找到解决方案。谢谢谢谢你,伙计,这对我也有用!我有这个bug已经有大约一年了,将它与:tableView.contentInsetAdjustmentBehavior=。结合起来,我总是不得不使用这个解决方案,这确实让我感觉有点不舒服。我成功地将+1.0降低到+0.2谢谢!如果没有这行代码,Bruno的建议会导致
    UIScrollView.ScrollStop
    出现问题。(注意:您也可以在“尺寸检查器”窗格的IB中设置此选项。)
    refreshControl.addTarget(controller, action: #selector(refreshData(_:)), for: .valueChanged)
    
    @objc func refreshData(_ refreshControl: UIRefreshControl) {
            refreshControl.endRefreshing()
            self.model.loadAPICall {
                self.tableView.reloadData()
            }
        }
    
    tableView.backgroundView = refreshControl