Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
iOS UITableView偏移刷新控件_Ios_Swift_Uitableview_Uirefreshcontrol - Fatal编程技术网

iOS UITableView偏移刷新控件

iOS UITableView偏移刷新控件,ios,swift,uitableview,uirefreshcontrol,Ios,Swift,Uitableview,Uirefreshcontrol,我有一个受superview约束的UITableView。因此,第一个单元格位于superview的顶部。这意味着在iPhoneX上,第一个电池在缺口下流血,进入状态栏区域。这是完全正确的。我希望单元格在槽口下方出血并进入状态栏区域,这是当前结果 问题是,我还希望在该表视图上有一个刷新控件,以便用户可以通过拉刷新内容。但是当你在iPhoneX上拉刷新按钮时,刷新控制被槽口切断。我不希望刷新控件被槽口切断 所以基本上我想做的是将表视图约束到superview,但将刷新控件约束到安全区域 我已经看过

我有一个受superview约束的UITableView。因此,第一个单元格位于superview的顶部。这意味着在iPhoneX上,第一个电池在缺口下流血,进入状态栏区域。这是完全正确的。我希望单元格在槽口下方出血并进入状态栏区域,这是当前结果

问题是,我还希望在该表视图上有一个刷新控件,以便用户可以通过拉刷新内容。但是当你在iPhoneX上拉刷新按钮时,刷新控制被槽口切断。我不希望刷新控件被槽口切断

所以基本上我想做的是将表视图约束到superview,但将刷新控件约束到安全区域

我已经看过了,苹果并没有提供很多属性或方法来定制刷新控件的行为

我曾考虑过使用某种类型的自定义解决方案,但我想到的每个自定义解决方案都会丢失刷新控件和表视图滚动等所有预构建的物理特性。有这么多的幕后逻辑,我真的不想牺牲刷新的感觉以及用户的感觉,因为这已经成为iOS中的一个常见动作

关于如何让第一个单元格在槽口下出血(约束到superview),但确保刷新控制不会被槽口切断(约束到安全区域)有何想法

我还附上了下面的屏幕截图,显示了单元格是如何进入状态栏的,以及刷新控件是如何被槽口切断的

编辑:我还向您发布了一个示例项目

但是下面是与刷新控件相关的基本代码

private lazy var refreshControl = UIRefreshControl()
override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl.addTarget(self, action: #selector(handleRefresh), for: .valueChanged)
    tableView.refreshControl = refreshControl
}

@objc func handleRefresh() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
        self.refreshControl.endRefreshing()
    }
}


表格视图的顶部约束必须相对于上页边距


解决方案很简单,您可以在viewDidLoad中设置刷新控件的边界。使用所需的y偏移值(例如50)

更新:

您可以在刷新开始时添加内容插入,然后在刷新结束时将其带回

  override func viewDidLoad() {
        super.viewDidLoad()


      refreshControl.addTarget(self, action: #selector(handleRefresh), for: .valueChanged)
      refreshControl.bounds = CGRect(x: refreshControl.bounds.origin.x,
                                     y: -100,
                                     width: refreshControl.bounds.size.width,
                                     height: refreshControl.bounds.size.height);
      tableView.refreshControl = refreshControl
    }

    @objc func handleRefresh() {
      self.tableView.contentInset = UIEdgeInsets(top: 200, left: 0, bottom: 0, right: 0)
        DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
          self.refreshControl.endRefreshing()
          self.tableView.contentInset = UIEdgeInsets.zero
          self.tableView.setContentOffset(.zero, animated: true)
        }
    }

您可以从参考底图
UIScrollView
中获益。通过github示例,您获得了所需的一切,因此,如果您通过以下方式对其进行扩展:

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y < 0 {
            topConstraint.constant = -scrollView.contentOffset.y/2
        } else {
            topConstraint.constant = 0
        }
    }
}
扩展视图控制器:UIScrollViewDelegate{ func scrollViewDidScroll(scrollView:UIScrollView){ 如果scrollView.contentOffset.y<0{ topConstraint.constant=-scrollView.contentOffset.y/2 }否则{ topConstraint.constant=0 } } } 每次
contentOffset
开始低于
0
时的反应是什么,并使您的
tableView
移动到底部,无论何时关闭或向下滚动,它都将设置为默认值-在您的情况下为
0

这样,您将获得与拖动力/距离相关的平滑动画,如下所示


添加加载视图时,您可以添加填充以防止出现此问题(),如果您为此发布代码,我们将更容易提供帮助you@RonakShah这难道不会给内容本身添加填充吗?我刚刚用一个示例项目GitHub repo链接以及刷新控制代码编辑了这个问题。我真的不知道如何添加更多相关的代码,因为在这一点上,这些代码都是非常标准的东西,大量的代码只是创建UITableView和interface的东西。请尝试启用
adjustScsrollViewInsets
,以获得
UIViewController
。基于
UITableView
的外观,我想说它们在故事板中没有被选中,这不是我要寻找的。正如我在我的问题
中所说的,这意味着在iPhoneX上,第一个细胞在缺口下流血,进入状态栏区域。这完全正确。
。我想让细胞进入状态栏区域。但我不想刷新控件。此解决方案的问题是,当释放pull以刷新时,内容位于加载指示器的下方,而不在加载指示器的下方,这使得加载指示器很难看到。Charlie,我已更新了答案,在更新部分,您可以看到问题的解决方案。添加内容插入也会降低加载指示器和内容。它不仅降低了内容,所以参考底图问题仍然存在。您可以看到我是如何解决它的,我为刷新控件添加了负y偏移量。在ViewDiLoad check refreshControl.bounds设置中。
extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y < 0 {
            topConstraint.constant = -scrollView.contentOffset.y/2
        } else {
            topConstraint.constant = 0
        }
    }
}