UITableViewController refreshControl является глючным, когда UITableViewController frame.height маленький

У меня проблема, связанная с тем, что UITableViewController refreshControl является сбойным, когда кадр UITableViewController находится ниже определенной высоты.

Как он есть, у меня есть UIViewController, и в нем у меня есть ContainerView, в который встроен UITableViewController. Я хочу, чтобы высота составляла 50% экрана.

Когда я использую refreshControl, я получаю такое поведение: Таблица прокрутки вниз вниз с самого конца при прокрутке вниз. Вы заметите это в конце этого видео, когда я решит медленно прокручиваться.

Эта проблема не возникает, если кадр ContainerView находится выше определенного значения. Таким образом, когда высота составляет 75% экрана, все работает отлично, а refreshControl - плавный. Если это 50%, то эта ошибка происходит.

Две разные вещи, которые я пробовал:

  • self.tableView.frame = CGRectMake(0, numOfPixelsToDropTableBy, self.tableView.frame.size.width, self.tableView.frame.size.height) - это одно, что я пробовал. Проблема с этим заключается в том, что вы хотите дать округленные углы tableView через ContainerView и тот факт, что ваш ContainerView по-прежнему занимает больше места, и это делает ограничения для других элементов неудобными.

  • Я пошел в Раскадровку, и в основном я имел верх ContainerView, где хотел. Затем у меня было дно, простирающееся за дно экрана, чтобы ContainerView достаточно большой высоты... но пользователь никогда не узнает. Кроме того, они будут знать, потому что теперь tableView выходит за пределы экрана, и я не могу видеть последние несколько строк моего tableView.

В конечном счете... Я не хочу использовать стороннюю библиотеку, но я хочу прекрасно функционировать refreshControl. Как я могу это исправить?

Ответы

Ответ 1

Мне удалось точно воссоздать вашу проблему случайно и удалось ее исправить, но ценой отсутствия полей.

Вероятно, прыжки происходят, если вы используете ограничения на основе маржи или любые поля для вашего вида контейнера. Если вы удаляете относительную часть поля по границам, прыжки исчезают.

Очень странно, но, похоже, проблема. Как только я добавлю ограничение относительного ограничения для контейнера, проблема вернется. Снимите его, и дисплей вернется к плавной прокрутке.

Казалось бы, это ошибка, и я думаю, вам нужно будет поднять отчет об ошибке с Apple.

Update:

Глядя снова, проблема, кажется, появляется, как только вид контейнера не является полной шириной экрана. Добавление любого вида поля в представление контейнера (с помощью макета по отношению к марже или путем установки ненулевого смещения при ограничении) приводит к скачкообразному поведению.

Update:

Что-то, казалось бы, было бы принципиально нарушено с помощью прокрутки UITableView внутри контейнера, который имеет какой-либо запас. Если вы переопределите делегат прокрутки, смещение/границы содержимого представления прокрутки будут изменены в момент, когда обновление будет запущено. Вот некоторые отладки, показывающие проблему

Start pulling down:

Scroll bounds = {{0, -127.33333333333333}, {374, 423}}
Scroll pos = [0.000000,-127.333333]
Scroll bounds = {{0, -127.66666666666667}, {374, 423}}
Scroll pos = [0.000000,-127.666667]
Scroll bounds = {{0, -128.33333333333334}, {374, 423}}
Scroll pos = [0.000000,-128.333333]

Ok before here ------->

Activity spinner becomes fully populated. Jump in scroll position upwards.

Scroll bounds = {{0, -104}, {374, 423}}
Scroll pos = [0.000000,-104.000000]

Scroll position corrects itself

Scroll bounds = {{0, -128.33333333333334}, {374, 423}}
Scroll pos = [0.000000,-128.333333]
Scroll position jumps the other direction by the same amount
Scroll bounds = {{0, -151.33333333333334}, {374, 423}}
Scroll pos = [0.000000,-151.333333]

Value changed target action fires. Bounds seem to reset (think 44 is height of refresh control

Scroll bounds = {{0, -44}, {374, 423}}
Scroll pos = [0.000000,-44.000000]
Corrects back
Scroll bounds = {{0, -151.33333333333334}, {374, 423}}
Scroll pos = [0.000000,-151.333333]
Fully corrects to the right scroll position by jumping back.

Ok after here ------>

Scroll bounds = {{0, -128.66666666666666}, {374, 423}}
Scroll pos = [0.000000,-128.666667]
Scroll bounds = {{0, -129}, {374, 423}}
Scroll pos = [0.000000,-129.000000]
Scroll bounds = {{0, -129.33333333333334}, {374, 423}}
Scroll pos = [0.000000,-129.333333]
Scroll bounds = {{0, -129.66666666666666}, {374, 423}}
Scroll pos = [0.000000,-129.666667]
Scroll bounds = {{0, -130}, {374, 423}}

Заключение

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

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

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

И наконец...

Чтобы не быть побежденным, вы можете применить масштабирующее преобразование к контроллеру навигации для представления таблицы для создания поля, которое делает следующее в контроллере табличного представления:

override func viewWillAppear(animated: Bool) {
  super.viewWillAppear(animated)

  // Add a scaling transform to the whole embedded controller view.      
  self.navigationController!.view.transform=CGAffineTransformMakeScale(0.9, 0.9);
}

Это делает вид встроенного контроллера на 90% меньше, поэтому он имеет границу вокруг границы. Измените масштаб, чтобы изменить размер рамки.

Не идеально, но отлично работает без прокрутки прокрутки и имеет границу. Это также дает вам возможность свободно использовать закругленные углы и т.д., Поскольку весь контент масштабируется.

Ответ 2

1. Я создал следующую архитектуру
введите описание изображения здесь
2.Добавлены некоторые ограничения
введите описание изображения здесь
3.In TableViewController Я добавил следующий код

import UIKit

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.refreshControl = UIRefreshControl(frame: CGRectZero)
        self.refreshControl!.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    }

    func refresh(sender:UIRefreshControl)
    {
        self.refreshControl?.endRefreshing()
    }
}
  1. И загруженный пример github

ВАЖНОЕ ПРИМЕЧАНИЕ Я использовал Xcode 7 и Swift 2.

Ответ 3

Кажется, что вы почти решили свою проблему (с грубой работой), используя вашу попытку UIContainerView с экрана. Сделайте еще один снимок, но на этот раз попробуйте:

  • Увеличение числа строк в numberOfRowsInSection: на 1.
  • Внутри вашего метода cellForRowAtIndexPath: установите последнее свойство ячейки rowHeight на расстояние, которое ваш вид контейнера находится ниже экрана.

Шаг 2 не будет работать, если вы используете метод tableView:heightForRowAtIndexPath:. Вместо этого вам нужно будет установить высоту последней ячейки, используя свой индекс. Использование этого дополнительного метода может привести к серьезным проблемам с производительностью и может также привести к задержкам с элементами управления обновлениями.

Ответ 4

Следуя моему комментарию:

Чтобы получить UIRefreshControl, он хорошо играет с UICollectionView или UITableView. Я пробовал много вещей, но в конце UIRefreshControl действительно работает только в UITableViewController.

Затем возникает проблема с настройкой tintColor UIRefreshControl:, иногда она окрашивает счетчик, иногда это не так, иногда tintColor необходимо установить внутри блока анимации для некоторые причины вступают в силу.

Поэтому я отказался от UIRefreshControl и реализовал свое собственное решение. Это не так просто, как установка UIRefreshControl на UITableViewController, но:

  • он отлично работает (или, по крайней мере, мне не удалось найти открытые крайние регистры: если вы их найдете, напишите запрос на растяжение)

  • вы можете реализовать любой вид загрузки (что-то, что вращается, что-то, что отскакивает, может быть, даже вид карты, или некоторые UIKit Dynamics).

Вы можете найти его здесь:

JRTRefreshControl