Передача вертикального прокручивания в UITableView ниже

(отредактирован для ясности)

У меня есть UITableView. Кроме того, это UIView с прилагаемым жестом Pan. Этот Pan перемещает влево и вправо, чтобы изменить базовую таблицу. Я использую метод движения жевательной резинки для перемещения таблицы. Это нормально работает.

Однако, UIView и его жест Pan препятствуют прокрутке вверх/вниз UITableView. Как я могу отправить прокрутку вверх/вниз в таблицу и сохранить левую-правую область просмотра?

 ---------------------------------------
 |                                     |
 |             ----------------------  |
 |             |                    |  |
 |             |                    |  |
 |             |                    |  |
 | UITableView |                    |  |
 |             |        UIView      |  |
 |             |          +         |  |
 |             |       PanGesture   |  |
 |             |                    |  |
 |             |                    |  |
 |             |                    |  |
 |             |                    |  |
 |             ----------------------  |
 |                                     |
 |                                     |
 ---------------------------------------

Метод, вызванный жестом "Пан", выглядит следующим образом:

 -(void)move:(UIPanGestureRecognizer*)sender
 {
     CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view];
     float xTest = fabsf(translatedPoint.x);
     float yTest = fabsf(translatedPoint.y);
     if ( xTest>yTest)
     {
         // Move table view left-right.. this works
     } else
     {
         // Send up-down scrolling gesture to table view????? How to?
     }
 }

Ответ 1

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

Я подклассифицировал UIPanGestureRecognizer и реализовал метод touchhesMoved и проверил, был ли этот жест более горизонтальным или вертикальным. Ниже приведен фрагмент. Кредит принадлежит другому сообщению stackoverflow, но я не могу найти ссылку на данный момент. (Извините заранее за плохое форматирование, публикацию в первый раз)

-(void)touchesMoved:(NSSet*) touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
if(self.state == UIGestureRecognizerStateFailed) return;
CGPoint currentPoint = [[touches anyObject] locationInView:self.view];
CGPoint prevPoint = [[touches anyObject] previousLocationInView:self.view];
moveX += prevPoint.x - currentPoint.x;
moveY += prevPoint.y - currentPoint.y;
if(!drag) {
    if(abs(moveY) > abs(moveX))
        drag = YES;
    else
        self.state = UIGestureRecognizerStateFailed;
}
}

-(void)reset
{
[super reset];
drag = NO;
moveX = 0;
moveY = 0;
}

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

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if([gestureRecognizer isKindOfClass:[VerticalPanGestureRecognizer class]])
{
    return YES;
}
return NO;
}

Сообщите мне, если это неясно.

Удачи!

Ответ 2

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

cancelsTouchesInView

Логическое значение, влияющее на то, передаются ли касания к представлению, когда распознается жест.

@property(nonatomic) BOOL cancelsTouchesInView

Обсуждение

Если это свойство равно YES (по умолчанию) и приемник признает его жест, прикосновения к тому же жесту не доставляются на представление, и ранее отменено через touchceCancelled: withEvent: сообщение, отправленное на Посмотреть. Если распознаватель жестов не распознает его жест, или если значение этого свойства равно NO, представление получает все штрихи в multi-touch.

Доступен в iOS 3.2 и более поздних версиях.

Из ссылка UIGestureRecognizer.

Ответ 3

ОК, ответ заключался в том, чтобы добавить панорамирование в UITableView вместо UIView. Я проверяю, находится ли местоположение жестов в пределах границ (теперь скрытых в xib) UIView, например:

 - (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
 {
     CGPoint translation = [gestureRecognizer locationInView:self.view];
     CGRect frame = self.slideTarget.frame;
     if (CGRectContainsPoint(frame, translation))
     {
         return YES;
     } else
     {
         return NO;
     }
 }

Boom.

Ответ 4

Я понимаю, что вы хотите, чтобы жест в UIView обрабатывался в соответствии с его направлением (вертикальный → таблица прокрутки, горизонтальный → прокрутка UIView). Я читал - не пробовал об этом: UISwipeGestureRecognizer имеет направление атрибутов - из документов:

The permitted direction of the swipe for this gesture recognizer.

Может быть, это может вам помочь?

EDIT: О, ну, я не узнал, что вы смотрите на UIPanRecognizer (слишком много "проведите" там)... Может быть, вы можете передать жест на стол, когда направление панорамирования "достаточно вертикально", как сообщается translationInView:..?

Ответ 5

В методе "Жест" в Пане используйте это:

- (void)pan:(UIPanGestureRecognizer *)gesture
{
    CGPoint translatedPoint = [gesture translationInView:self.tableView];

    if (ABS(translatedPoint.y) > 10.0f) {
        self.tableView.bounds = CGRectMake(0, -translatedPoint.y, 320, 460);
    }
    if (ABS(translatedPoint.x) > 10.0f) {
        // swipe left/right code...
    }
}

Здесь вы подражаете прокрутке своего вида таблицы, изменяя его свойство bounds. Но этот код не будет отображаться в виде таблицы. Этот эффект может быть достигнут путем сохранения состояния свойства отказов в начале жесты панорамы и последующего присвоения этого свойства, когда жест будет завершен.

Ответ 6

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

UINavigationController → Вид (Контроллер навигации будет иметь UITableViewController) UITableViewController (он будет иметь UiTableView)

И в конце

UIView (UINavigationController.view subview UIView)

Итак, вы хотите, чтобы, если вы выполняете панорамирование (прокрутку) на вашем UIView, тогда ваш TableView будет правильно прокручиваться.

Итак, вам нужно создать класс вашего требуемого UIView (Предположим, что CustomView). Затем выполните следующие методы в своем классе CustomView.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *hitView = [super hitTest:point withEvent:event];

    // If the hitView is THIS view, return the view that you want to     receive the touch instead:
    if (hitView == self) {
        return _tableView;
    }
    else if ([hitView isKindOfClass:[UIButton class]]) {
        return hitView;
    }
    return _tableView;
}

Если у вас есть кнопка subview в вашем CustomView. Затем вы получите выбор на нем.

Извините меня за мое плохое объяснение, но я нашел это решение для своей проблемы, и я хочу поделиться им с вами.

Сообщите мне, если вам нужно больше объяснений. Я объясню позже.

Ответ 7

Внедрите метод UIGestureReconizerDelegate, названный - gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:.

Он возвращает false по умолчанию, реализует его и возвращает true.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return true;
}

И, не забудьте установить свойство gesture delegate.

// Set the delegate of the panGesture. For example
self.panGestureReconizer.delegate = ... //

Из документа Apple

(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

просит делегата, если двум распознавателям жестов разрешено одновременно распознавать жесты.

Возвращаемое значение

ДА, чтобы одновременно распознавать жестов обоих жестовRecognizer и otherGestureRecognizer. Реализация по умолчанию возвращает NO-no два жесты могут быть распознаны одновременно.

Обсуждение

Этот метод вызывается, когда распознавание жеста с помощью gestureRecognizer или otherGestureRecognizer блокирует другой распознаватель жестов от распознавания его жеста. Обратите внимание, что возвращение ДА гарантирует одновременное распознавание; возврат НЕТ, с другой стороны, не гарантированно предотвращает одновременное распознавание, потому что другой делегат распознавателя жестов может вернуть ДА.


Подробнее