代码之家  ›  专栏  ›  技术社区  ›  Charlie Fish

iOS UITableView偏移刷新控件

  •  8
  • Charlie Fish  · 技术社区  · 7 年前

    我有一个UITableView,它被限制到superview。所以第一个单元格在superview的顶部。这意味着在iphonex上,第一个细胞会在缺口下出血,并进入状态栏区域。这是完全正确的。我 希望 单元格将在槽口下出血并进入状态栏区域,这是当前结果。

    问题是,我还希望在该表视图上有一个refresh控件,以便用户可以通过拉来刷新内容。但是,当你在iphonex上拉刷新时,刷新控件会被notch切断。我不想刷新控件被切口切断。

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

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

    编辑: GitHub here .

    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()
        }
    }
    

    enter image description here

    enter image description here

    3 回复  |  直到 7 年前
        1
  •  14
  •   Jakub Streetboy    7 年前

    你可以利用底层的好处 UIScrollView

    extension ViewController: UIScrollViewDelegate {
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            if scrollView.contentOffset.y < 0 {
                topConstraint.constant = -scrollView.contentOffset.y/2
            } else {
                topConstraint.constant = 0
            }
        }
    }
    

    每次都有什么反应 contentOffset 开始低于 0 让你的 tableView 移动到底部,无论何时关闭或向下滚动它都将被设置为默认值-在您的情况下 0 .

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

    enter image description here

        2
  •  11
  •   Anton Rodzik    7 年前

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

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

    And now it looks like this

    更新:

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

      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)
            }
        }
    
        3
  •  -3
  •   Carlos Chaguendo    7 年前

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

    enter image description here

    enter image description here

    推荐文章