UITableView тянуть, чтобы обновить, вызывая мерцание. Как это предотвратить? - PullRequest
5 голосов
/ 27 февраля 2012

Я делаю эту вещь для обновления. В scrollViewDidEndDecelerating я проверяю, находится ли смещение за определенной точкой, а в scrollViewDidEndDragging я устанавливаю contentInset, чтобы сохранить раскрывающийся раздел видимым.

Однако это приводит к мерцанию, возможно, из-за сброса содержимого содержимого во время анимации прокрутки. Я думал, что смогу предотвратить это, установив targetContentOffset в scrollViewWillEndDragging, но, похоже, это не сработает.

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

     if (scrollView.contentOffset.y < -kRefreshViewDelta) 
     {
         self.tableView.contentInset = UIEdgeInsetsMake(kRefreshViewHeight, 0.0f, 0.0f, 0.0f);

     }
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
 {
     if (scrollView.contentOffset.y  < -kRefreshViewDelta) 
     {
          targetContentOffset->y = kRefreshViewHeight ;
     }
 }

Ответы [ 3 ]

10 голосов
/ 07 марта 2012

Если вы вообще измените кадр, назначенный для UITableView (во время прокрутки или иным образом), это приведет к сбросу contentInset к значению по умолчанию (0,0,0,0).Для моего состояния есть некоторая проверка состояния, но по сути это то, что я сделал для моего ...

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
                  willDecelerate:(BOOL)decelerate {
  if (scrollView.contentOffset.y < -kRefreshDeltaY) {
    animation = ^{
        [self setContentInset:UIEdgeInsetsMake(kRefreshDeltaY,
                                                          0, 0, 0)];
    };

    [UIView animateWithDuration:0.3
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:animation
                     completion:completion];
  } // if
}

Пока я не выкладывал подпредставления и не изменял фрейм UITableView, этовела себя хорошо для меня.

4 голосов
/ 28 марта 2012

Ответ Майка сработал для меня (но я не мог голосовать или комментировать).Похоже, что завершение моего кода в блоке анимации устранило для меня мерцание.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{
    if (scrollView.contentOffset.y < 0 && scrollView.contentInset.top < 0)
    {
        // shows table header view
        // setting inset without using animation block causes flicker
        [UIView animateWithDuration:0.1 animations:^
        {
            scrollView.contentInset = UIEdgeInsetsZero;
        }];
    }

    // hides table header view
    if (scrollView.contentOffset.y > 44 && scrollView.contentInset.top == 0)
    {
        scrollView.contentInset = UIEdgeInsetsMake(-44, 0, 0, 0);
    }
}
0 голосов
/ 13 марта 2012

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

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if (!reloading)
    {
        checkForRefresh = YES;  //  only check offset when dragging
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (reloading) return;

    if (checkForRefresh) {
        if (refreshHeaderView.isFlipped
            && scrollView.contentOffset.y > -65.0f
            && scrollView.contentOffset.y < 0.0f
            && !reloading) {
            [refreshHeaderView flipImageAnimated:YES];
            [refreshHeaderView setStatus:kPullToReloadStatus];


        } else if (!refreshHeaderView.isFlipped
                   && scrollView.contentOffset.y < -65.0f) {
            [refreshHeaderView flipImageAnimated:YES];
            [refreshHeaderView setStatus:kReleaseToReloadStatus];

        }
    }
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
                  willDecelerate:(BOOL)decelerate
{
    if (reloading) return;

    if (scrollView.contentOffset.y <= - 65.0f) {
        if([self.tableView.dataSource respondsToSelector:
            @selector(reloadTableViewDataSource)]){
            [self showReloadAnimationAnimated:YES];
            [self reloadTableViewDataSource];
        }
    }
    checkForRefresh = NO;
}   


- (void)reloadTableViewDataSource
{
    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO];

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