Выпуск таблицы прокрутки с вложенным содержимым - PullRequest
5 голосов
/ 06 декабря 2010

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

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

Я реализовал функцию обновления для просмотра в области вставки содержимого табличного представления. При обновлении запускается Async NSURLConnection, который извлекает данные из веб-сервера, анализирует соответствующую информацию и обновляет таблицу по мере необходимости.

Здесь начинается процесс обновления:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

    if (scrollView.contentOffset.y <= - 65.0f && !self.reloading) {
        self.reloading = YES;
        [self reloadTableViewDataSource];
        [refreshHeaderView setState:EGOOPullRefreshLoading];
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.2];
        self.tableView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);
        [UIView commitAnimations];
    }
}

Проблема в том, что если я начинаю прокручивать содержимое, пока вкладка содержимого «видима» (то есть во время перезагрузки), я получаю странное поведение, когда разделы моей таблицы не прокручиваются до самого верха - см. Скриншот для наглядного представления о том, что Я пытаюсь описать здесь.

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

Кто-нибудь испытывал это раньше? Любые идеи о том, что я должен смотреть, чтобы попытаться это исправить?

Большое спасибо заранее, Рог

alt text

И это результат, если я начну прокручивать таблицу. Оранжевый бит в верхней части изображения - это фактическая панель навигации, где я ожидаю, что раздел таблицы (дата 1 декабря 2010 г.) будет иметь вид.

alt text

Ответы [ 4 ]

8 голосов
/ 11 февраля 2011

Я полагаю, у вас есть что-то вроде if (self.reloading) return; в вашем scrollViewDidScroll методе?Вы можете добавить это, чтобы решить вашу проблему:

if (self.reloading) {
    if (scrollView.contentOffset.y > -60.0 && scrollView.contentOffset.y < 0.0 && insetOnReload) {
        [self.tableView setContentInset:UIEdgeInsetsMake(-scrollView.contentOffset.y, 0.0, 0.0, 0.0)];
    }
    else if (scrollView.contentOffset.y >= 0.0 && insetOnReload) {
        [self.tableView setContentInset:UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)];
        insetOnReload = NO;
    }
    return;
}

Установите insetOnReload на YES, если вы начинаете перезагрузку.

1 голос
/ 06 января 2011

Разве это не ожидаемое поведение? Вы устанавливаете contentInset tableView, который совпадает с scrollView в этом примере, и, таким образом, tableView вставляет его содержимое с заданным вами полем. Расстояние между нижней частью вашего вида вкладки и заголовком раздела составляет 60 пикселей (на снимке экрана сетчатки - 120 пикселей), поэтому оно точно соответствует значению contentInset.top.

Я полагаю, вы сбросили contentInset на 0.f после обновления; Ваше неправильное поведение исчезает после обновления?

0 голосов
/ 26 апреля 2012

Просто установите для contentOffset точку y на 1 пиксель выше или ниже, и этого не произойдет.

 CGPoint pt = scrollView.contentOffset;
 scrollView.contentInset = UIEdgeInsetsMake(60.0f, 0.0f, 0.0f, 0.0f);

 scrollView.contentOffset = CGPointMake(pt.x, pt.y-1);
0 голосов
/ 09 января 2011

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

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

Кроме того, вы рассматривали возможность изменения иерархии ваших представлений? Не могли бы вы вынуть вкладки из tableView, поместить их в верхнюю часть экрана и получить tableView ниже? Тогда вам не придется беспокоиться об установке вставки вообще. Просто мысль, я не видел остальную часть приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...