Nano Hash - криптовалюты, майнинг, программирование

Конфликт UIPanGestureRecognizer с scrollview

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

В моем глобальном UIView установлен UIPanGestureRecognizer следующим образом:

_bottomPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(bottomPanGestureDetected:)];
_bottomPanGestureRecognizer.minimumNumberOfTouches = 2;
_bottomPanGestureRecognizer.maximumNumberOfTouches = 2;
_bottomPanGestureRecognizer.delaysTouchesBegan = NO;
_bottomPanGestureRecognizer.delaysTouchesEnded = NO;

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

Проблема в том, что scrollview распознает свой собственный жест панорамирования раньше моего.

Поэтому я попытался отложить это благодаря:

[_scrollView.panGestureRecognizer requireGestureRecognizerToFail:_bottomPanGestureRecognizer];

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

Я бы хотел, чтобы это мероприятие не откладывалось, возможно ли это? Любая идея приветствуется!

Ваше здоровье.

Кирилл


  • Вы пробовали установить maximumNumberOfTouches из _scrollView.panGestureRecognizer на 1? 01.02.2013
  • Да, но, как ни странно, это условие игнорируется. 01.02.2013
  • Ну, еще один вариант - реализовать UIGestureRecognizerDelegate gestureRecognizerShouldBegin: и проверить там количество касаний. Так что если это два касания, return NO 01.02.2013
  • Не работает из-за этого: встроенный распознаватель жестов панорамирования UIScrollView должен иметь представление прокрутки в качестве делегата. Кажется, невозможно переопределить делегат распознавателя жестов просмотра прокрутки. Есть еще идеи? 05.02.2013
  • Вы нашли для этого решение? у меня такая же проблема 06.05.2013

Ответы:


1

Если это еще не решено, я решил проблему за себя.

Я добавил UIPanGestureRecognizer в UIScrollView для обнаружения двух жестов сдвига пальца, и поведение UIScrollView по умолчанию (прокрутка к чему-то) по-прежнему работает.

Итак, я добавил UIPanGestureReconizer в UIScrollView:

UIPanGestureRecognizer *pangestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(displayReloadIndicator:)];
pangestureRecognizer.minimumNumberOfTouches = 2;
pangestureRecognizer.delegate = self;
[self.scrollView addGestureRecognizer:pangestureRecognizer];
[pangestureRecognizer release];

После этого я добавил код:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    return YES;
}

После этого я реализовал метод действия распознавателей жестов панорамирования.

- (void) displayReloadIndicator:(UIPanGestureRecognizer*) panGestureRecognizer {

    UIGestureRecognizerState gestureRecognizerState = gestureRecognizer.state;

    CGPoint translation = [gestureRecognizer translationInView:self.scv_bibgesamt];

    if (gestureRecognizerState == UIGestureRecognizerStateBegan) {

        // create a UIView with all the Pull Refresh Headers and add to UIScrollView
        // This is really much lines of code, but its simply creating a UIView (later you'll find a myRefreshHeaderView, which is my base view) and add UIElements e.g. UIActivityIndicatorView, a UILabel and a UIImageView on it
        // In iOS 6 you will also have the possibility to add a UIRefreshControl to your UIScrollView

    }

    else if (gestureRecognizerState == UIGestureRecognizerStateEnded
             || gestureRecognizerState == UIGestureRecognizerStateCancelled) {

        if (translation.y >= _myRefreshHeaderView.frame.size.height + 12) { // _myRefreshHeaderView is my baseview

         //so the UIScrollView has been dragged down with two fingers over a specific point and have been release now, so we can refresh the content on the UIScrollView
         [self refreshContent];

         //animatly display the refresh view as the top content of the UIScrollView
         [self.scrollView setContentOffset:CGPointMake(0, myRefreshHeaderView.frame.size.height) animated:YES];
    }

    else {

         //the UIScrollView has not been dragged over a specific point so don't do anything (just scroll back to origin)
         [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];

         //remove the view (because it's no longer needed)
         [_myRefreshHeaderView removeFromSuperview];
    }
}

ОБНОВЛЕНИЕ:

Если вы можете захотеть интегрировать функцию прокрутки назад из вашего контроллера навигации, вам следует интегрировать следующий код:

- (void) viewDidLoad {

    [super viewDidLoad];


    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

        self.navigationController.interactivePopGestureRecognizer.enabled = YES;

        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }

    //setup view controller
}

и

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

    if (gestureRecognizer == _panGestureRecognizer
        && [self.navigationController.viewControllers count] > 1) {

        CGPoint point = [touch locationInView:self.view.window];

        if (point.x < 20
            || point.x > self.view.window.frame.size.width - 20) {

            return NO;
        }
    }

    return YES;
} 
15.05.2013

2

Реализуйте делегат panRecognizer для одновременного распознавания UIScrollView UIGestureRecognizer

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if (_panRecognizer == gestureRecognizer) {
        if ([otherGestureRecognizer.view isKindOfClass:UIScrollView.class]) {
            UIScrollView *scrollView = (UIScrollView *)otherGestureRecognizer.view;
            if (scrollView.contentOffset.x == 0) {
                return YES;
            }
        }
    }

    return NO;
}
10.03.2016
  • У меня отлично сработало. Вот этот код в Swift 4: func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { if let scrollView = otherGestureRecognizer.view as? UIScrollView { return scrollView.contentOffset.x == 0 } return false } 27.09.2018

  • 3

    SWIFT 4

    При использовании scrollView, который вы можете использовать ниже, это только panGestureRecognizer, когда scrollView перетаскивается на самый верх:

    translation.y> 0 означает, что вы перемещаетесь сверху вниз, а locationInScrollView.y ‹500.0 означает, что вы заканчиваете перетаскивание на 500 или меньше (вы можете настроить это), чтобы предотвратить обновление в середине или внизу прокрутки.

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    
        let translation = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
        let locationInScrollView = scrollView.panGestureRecognizer.location(in: scrollView)
    
        if translation.y > 0 && locationInScrollView.y < 500.0 {
            print("scrollView refresh:  Y: \(locationInScrollView.y)")
            setupUI()
        }
    }
    
    27.09.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..