Передача касаний из вышележащего UIView в нижележащий UITableView не работает (как вы видите, касания проходят, но не прокручиваются). Это связано с тем, что UITableView (как подкласс UIScrollView) выполняет всевозможные странные действия с цепочкой респондента (ваш код также немного странный, когда вы вызываете как touchesBegan, так и touchesEnded из метода touchesBegan вышележащего представления, но это не поэтому ты не можешь прокрутить стол).
Простой способ достичь того, чего вы хотите (если я правильно понял), это переопределить метод hitTest:withEvent:
в вашем вышележащем представлении и заставить метод возвращать базовый UITableView (вместо self
, который является реализация по умолчанию):
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UITableView *tv = (UITableView *)[self.superview.subviews objectAtIndex:0];
return tv;
}
Обратите внимание, что в этом коде предполагается, что UITableView
является первым представлением, добавленным к вашему контроллеру представления, и что после него добавляется перекрывающий UIView
.
Редактировать: ОК, перечитав ваш вопрос, я думаю, что понимаю ваш вопрос. У вас есть главное представление с высотой 30, и к этому представлению вы добавили UITableView при y = 30. Я думаю, что добавление этого метода к вашему основному виду сделает то, что вам нужно:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (point.y < self.frame.size.height) {
return self;
} else {
return myTableView; // assumes myTableView is a reference to the
// UITableView that you've added
}
}
По сути, вы говорите ОС, что все касания должны передаваться myTableView
, если они находятся за пределами вашего основного вида.
Однако более простым способом было бы добавить как основной вид с 30 пикселями (оранжевая вещь), так и UITableView как подпредставления другого представления (или контроллера представления). Таким образом, вам не придется делать ничего хитрого, чтобы ваш стол вел себя как обычный стол.