Как ограничить расстояние вытягивания с помощью элемента управления обновлением?

Я пытаюсь загрузить некоторые данные в UITableView, используя UIRefreshControl. Я сделал,

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

    // Get the current size of the refresh controller
    CGRect refreshBounds = refreshControl.bounds;

    // Distance the table has been pulled >= 0
    CGFloat pullDistance = MAX(0.0, -self.newsTableView.contentOffset.y);

    // Half the width of the table
    CGFloat midX = self.newsTableView.frame.size.width / 2.0;

    CGFloat spinnerHeight = self.compass_spinner.bounds.size.height;
    CGFloat spinnerHeightHalf = spinnerHeight / 2.0;

    CGFloat spinnerWidth = self.compass_spinner.bounds.size.width;
    CGFloat spinnerWidthHalf = spinnerWidth / 2.0;

    // Set the Y coord of the graphics, based on pull distance
    CGFloat spinnerY = pullDistance / 2.0 - spinnerHeightHalf;

    // Calculate the X coord of the graphics, adjust based on pull ratio
    CGFloat spinnerX = (midX - spinnerWidthHalf);

    // When the compass and spinner overlap, keep them together
    self.isRefreshIconsOverlap = YES;

    // If the graphics have overlapped or we are refreshing, keep them together
    if (self.isRefreshIconsOverlap || refreshControl.isRefreshing) {
        spinnerX = midX - spinnerWidthHalf;
    }

    CGRect spinnerFrame = self.compass_spinner.frame;
    spinnerFrame.origin.x = spinnerX;
    spinnerFrame.origin.y = spinnerY;

    self.compass_spinner.frame = spinnerFrame;

    // Set the encompassing view's frames
    refreshBounds.size.height = pullDistance;

    self.refreshColorView.frame = refreshBounds;
    self.refreshLoadingView.frame = refreshBounds;

    // If we're refreshing and the animation is not playing, then play the animation
    if (refreshControl.isRefreshing && !self.isRefreshAnimating) {
        [self animateRefreshView];
    }
}

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

 // Initialize Refresh Control
refreshControl = [[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];

// Configure Refresh Control
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

Чтобы обновить с помощью этого, мне нужно перетащить примерно 1/2 экрана. Как я могу обновить это коротким перетаскиванием?


person codebot    schedule 21.10.2015    source источник
comment
Зачем ты все это делаешь? Если вы используете стандартный UITableViewController, добавление поддержки pull-to-refresh — это всего лишь 3 простые строки кода в viewDidLoad для настройки UIRefreshControl. Нет необходимости в каком-либо коде в методе scrollViewDidScroll:.   -  person rmaddy    schedule 21.10.2015


Ответы (2)


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

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < -110 && ![refreshControl isRefreshing]) {
        [refreshControl beginRefreshing];
        //your code for refresh
        [refreshControl endRefreshing];
    }
}
person Ty Lertwichaiworawit    schedule 21.10.2015
comment
Это хорошее быстрое решение проблемы, у вас все еще есть проблемы, такие как незаконченная анимация медленного вытягивания, но если не считать чего-то нестандартного, это делает работу. - person johnrechd; 21.09.2018

Возможно, вы столкнулись с этой проблемой, потому что неправильно настроили элемент управления обновлением. Не init контролируйте обновление с помощью фрейма. просто сделайте [[alloc] init] или [new] и поместите его в качестве фонового представления табличного представления. Табличное представление знает, как с этим справиться.

self.myRefreshControl = [UIRefreshControl new];
[self.myRefreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView setBackgroundView:self.myRefreshControl]; 

Вот как вы обычно настраиваете управление извлечением для обновления. Но если это все еще вас не удовлетворяет, вы можете либо создать подкласс UIRefreshControl, что абсолютно не является оптимальным решением для этого случая, либо вы можете просто обмануть методы делегата UIScrollView как tnylee предлагает. Но настраивать поведение по умолчанию в scrollViewDidScroll — не самое мудрое решение.

person Bagrat Kirakosian    schedule 22.10.2015
comment
для setBackgroundView это решило мою проблему по-другому - person Logic; 15.11.2016