Как я могу обнаружить прокрутку для обновления до завершения события перетаскивания в iOS?

#ios #objective-c #gestures

#iOS #objective-c #жесты

Вопрос:

Я хочу добавить жест обновления в некоторые представления в моем приложении iOS
Обычно этот жест прокручивается сверху и удерживается некоторое время

Я мог бы создать просто обработчик жестов, который работает, если пользователь удерживал прокручиваемый просмотр более 1 секунды:

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    if (scrollView == _tableView) {
        _scrollViewDragStarted = [NSDate date];
    }
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    if (scrollView == _tableView) {
        if (velocity.y < 0 amp;amp; targetContentOffset->y < 0) {
            NSTimeInterval hold = [[NSDate date] timeIntervalSinceDate:_scrollViewDragStarted];
            if (hold > 1) {
                // refreshing method calls here
            }
        }
        _scrollViewDragStarted = nil;
    }
}
  

Это работает отлично, но подсказка о удержании необходима, когда пользователь прокручивает вид сверху

Как я могу обнаружить такую прокрутку? scrollViewWillBeginDragging: событие не имеет параметров прокрутки, поскольку scrollViewWillEndDragging:withVelocity:targetContentOffset:

Или, может быть, существует другой способ реализовать это?

Ответ №1:

Попробуйте использовать scrollViewDidScroll(_:) . https://developer.apple.com/reference/uikit/uiscrollviewdelegate/1619392-scrollviewdidscroll

Обратите внимание, что вы можете использовать UIScrollView.contentOffset.y < 0 , чтобы проверить, прокручивалось ли оно выше вершины.

Комментарии:

1. в частности, определить, что contentOffset.y < 0

Ответ №2:

1) Вы можете использовать refreshcontrol и настроить его так, как вы хотите. Я бы рекомендовал использовать это в качестве основного API и также предоставляет вам забавные анимации. кроме того, это универсально и используется везде, поэтому пользователь уже будет знать, как использовать сравнение с вашим жестом прокрутки и секундного удержания.

-(недействительный)viewDidLoad {

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector (handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.MyTableView добавляет SUBVIEW:refreshControl];

}

-(void)handleRefresh: (id) отправитель { // выполните обновление здесь … }

Ответ №3:

вы можете использовать KVO для contentffset параметра

вот один из моих репозиториев Github

UIScrollView-XYPlusingRefresh

свяжитесь со мной, если хотите xiaoyulevin@gmail.com