我试图找出一种方法暂时(即在单个拖动手势中)禁用UITableView
上的滚动,然后重新启用它以使其在其中拾取离开了。
我的理由是我有一个手势识别器正在监控拖动,如果用户将手指拖到桌子顶部上方,我想用手指向上调整桌面大小,然后停止调整大小并继续滚动。
当然,我不希望表在调整大小时滚动,因为这有效地实现了滚动本身(通过移动整个表视图而不是内部可滚动内容),但我无法弄清楚如何以这样的方式执行此操作,即它允许手势在某个点之后再次生效(或者如果用户在桌面上向下拖动)。
有没有办法临时禁用/阻止手势而不会导致手势失败或直接取消?
也许我可以写一个UITableView
的子类来拦截手势并根据需要忽略它们。我应该覆盖哪种方法来做到这一点?
更新
我最后以不同的方式接近这个,即在每次更改手势时简单地调整表格视图的contentOffset
。我担心这可能看起来“紧张”,但它实际上非常顺利。但是我会把问题保持开放,因为我仍然很好奇是否可以这样做。
答案 0 :(得分:1)
应@BrunoGalinari的要求,这是我在UITableView
上处理平移手势的实现的主要部分,而不会破坏表格视图的内在滚动。
tableViewExpanded
是一个本地属性,可在两种布局状态之间切换(扩展与否),并适当调整bottomViewHeightConstraint
常量。将其设置为自身只是将约束重新调整为两个有效值之一,因为它在平移期间也会受到影响。
- (void)handlePan:(UIPanGestureRecognizer*)sender {
static CGFloat initialBottomViewY;
static CGFloat initialTableViewContentOffsetY;
static CGFloat initialTouchPointY;
CGPoint touchPoint = [sender locationInView:self.view];
CGFloat splitOffset = touchPoint.y - initialBottomViewY;
BOOL inEffect = ( sender == self.tableViewPan && touchPoint.y < initialBottomViewY ) || ( sender == self.mapViewPan && touchPoint.y > initialBottomViewY );
switch ( sender.state ) {
case UIGestureRecognizerStateBegan: {
initialBottomViewY = self.bottomView.y;
initialTableViewContentOffsetY = self.tableView.contentOffset.y;
initialTouchPointY = touchPoint.y;
break;
}
case UIGestureRecognizerStateEnded: {
self.dragVelocity = [sender velocityInView:self.view].y;
if ( inEffect ) {
if ( ABS( splitOffset ) > 60.f ) { // adjust
if ( sender == self.mapViewPan && touchPoint.y > initialBottomViewY )
self.tableViewExpanded = NO;
else if ( sender == self.tableViewPan && touchPoint.y < initialBottomViewY )
self.tableViewExpanded = YES;
else
self.tableViewExpanded = self.tableViewExpanded;
} else
self.tableViewExpanded = self.tableViewExpanded; // spring back
}
break;
}
case UIGestureRecognizerStateChanged: {
if ( inEffect ) {
self.tableView.contentOffset = CGPointMake( self.tableView.contentOffset.x, initialTableViewContentOffsetY + initialTouchPointY - initialBottomViewY );
self.bottomViewHeightConstraint.constant = self.view.height - touchPoint.y;
self.annotationToSelect = nil;
[self adjustMapAnimated:NO];
}
break;
}
default: {
break;
}
}
}
以下是窗口的外观,以了解展示位置:
答案 1 :(得分:0)
您可以通过设置:
禁用UITableView
的滚动
table.scrollEnabled = NO;
如果您没有使用自定义手势,请启用它:
table.scrollEnabled = YES;
它是父类UIscrollView
的属性:
如果此属性的值为YES,则启用滚动,如果为NO,则禁用滚动。默认值为YES。
禁用滚动时,滚动视图不接受触摸事件;它将它们转发给响应者链。