2017-01-13 3 views
0

Я пытался пересылать события касания с одного вида на UITableView. Но я столкнулся с проблемой.Переслать событие касания в UITableView для создания прокрутки инерции

prototype app to illustrate problem

На чертеже представлен вид прототипа, чтобы проиллюстрировать эту проблему. Белый вид в нижней половине - нормальный UITableView. Желтый вид - UIView, который направляет до середины UITableView, используя hitTest:withEvent:. Красный вид - UIButton.

Цель состоит в том, чтобы переместить вверх и вниз панорамирование касаний от желтого вида до UITableView внизу. Тем не менее, нажатие красного UIButton должно по-прежнему работать.

Я пробовал 2 основных подхода, оба из которых имеют проблемы.

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

Второй подход - направить касания, используя hitTest:withEvent: в желтом виде.

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if([self.button_red pointInside: [self convertPoint:point toView:self.button_red] withEvent:event]) { 
     return self.button_red; 
    } else { 
     return [self.view_table hitTest:CGPointMake(self.view_table.width/2.0,self.view_table.height/2.0) withEvent:event]; 
    } 
} 

hitTest:withEvent: вызывается только тогда, когда прикосновение начинается в желтом зрения. Другими словами, всякий раз, когда перетаскивание начинается с красного изображения, он не перетаскивает перетаскивание в представление таблицы. Это недостаточно.

Можно ли перевести жест панорамы с желтого вида на UITableView по-другому, что позволяет красной кнопке работать и позволяет работать с перетаскиванием, которая начинается с красной кнопки? Должен ли я переопределить touch event methods в желтом представлении, чтобы заставить это работать как-то? Есть ли способ сделать все это, сохраняя инерционную прокрутку?

+1

Вы не можете установить yellowView как tableHeaderView в UITableView? –

+0

Это хорошая идея, но refreshControl окажется в верхней части экрана. Я хотел бы сохранить refreshControl ниже желтого вида –

+1

Хорошо, обновляет ли управление refreshControl вверх, если мы попробуем что-то подобное. [tableView addSubview: yellowView]; [tableView setContentInset: CGPointMake (0, CGRectGetHeight (yellowView.frame))]; –

ответ

1
  1. Вам необходимо добавить yellowView в качестве подсмотра внутри UITableView.
  2. Вам также необходимо позаботиться о contentInset, чтобы разместить для yellowView высоты.
  3. По умолчанию ячейки появятся над этим добавленным yellowView, вам нужно , чтобы исправить это, установив zPosition на yellowView.

    CGFloat height = CGRectGetHeight(yellowView.frame); 
    
    // fix yellowView's y position 
    yellowView.frame = CGRectMake(0, -height, CGRectGetWidth(yellowView.frame), height); 
    
    [tableView addSubview:yellowView]; 
    yellowView.layer.zPosition = 10; // make it appear over cells 
    
    [tableView setContentInset:UIEdgeInsetsMake(height, 0, 0, 0)]; 
    

Надеется, что это помогает.

+0

Отлично! Я не уверен, требуется ли zPosition, но это имеет смысл. –

Смежные вопросы