Элемент управления смещением iOS UITableView - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть UITableView, который ограничен суперпредставлением. Таким образом, первая ячейка находится наверху суперпредставления. Это означает, что на iPhone X первая ячейка кровоточит под надрезом и в области строки состояния. Что совершенно верно. Я хочу, чтобы ячейка прокачалась под надрезом и попала в область строки состояния, что является текущим результатом.

Проблема в том, что я также хочу обновить элемент управления в этом табличном представлении, чтобы пользователь мог обновить содержимое. НО, когда вы нажимаете, чтобы обновить на iPhone X, контроль обновления отключается на выемке. Я не хочу, чтобы элемент управления обновлением был обрезан на выемке.

Итак, в основном я хочу ограничить табличное представление суперпредставлением, но ограничить управление обновлением в безопасной области.

Я просмотрел, и не похоже, что Apple предоставляет много свойств или методов для настройки поведения элемента управления обновлением.

Я подумал об использовании какого-либо пользовательского решения, но каждое пользовательское решение, о котором я думал, теряет всю предустановленную физику управления обновлением и прокрутки табличного представления и тому подобное. Так много закулисной логики, и я действительно не хочу жертвовать ощущением тяги, чтобы обновиться, и тем, как это ощущается для пользователя, поскольку это стало таким распространенным действием в iOS.

Есть ли какие-либо идеи о том, как заставить первую ячейку кровоточить под надрезом (ограничено суперпредставлением), но обеспечить, чтобы элемент управления обновлением не обрезался надрезом (ограничено безопасной областью)?

Я также прикрепил скриншоты ниже того, как ячейки стекают в строку состояния, и как элемент управления обновлением отключается надрезом.

РЕДАКТИРОВАТЬ: Я также опубликовал пример проекта для GitHub здесь .

Но основной код, связанный с управлением обновлением, приведен ниже.

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 ]

0 голосов
/ 04 сентября 2018

Решение простое, вы можете установить границы элемента управления обновлением в 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)
        }
    }
0 голосов
/ 04 сентября 2018

Вы можете воспользоваться льготами для подкладки UIScrollView. На вашем примере с github у вас есть все, что вам нужно, так что если вы добавите его:

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

0 голосов
/ 01 сентября 2018

Верхнее ограничение табличного представления должно быть относительно верхнего поля

enter image description here

enter image description here

...