在拖动过程中暂时禁用UITableView滚动

时间:2015-02-06 23:18:58

标签: ios objective-c uitableview uiscrollview

我试图找出一种方法暂时(即在单个拖动手势中)禁用UITableView上的滚动,然后重新启用它以使其在其中拾取离开了。

我的理由是我有一个手势识别器正在监控拖动,如果用户将手指拖到桌子顶部上方,我想用手指向上调整桌面大小,然后停止调整大小并继续滚动。

当然,我不希望表在调整大小时滚动,因为这有效地实现了滚动本身(通过移动整个表视图而不是内部可滚动内容),但我无法弄清楚如何以这样的方式执行此操作,即它允许手势在某个点之后再次生效(或者如果用户在桌面上向下拖动)。

有没有办法临时禁用/阻止手势而不会导致手势失败或直接取消?

也许我可以写一个UITableView的子类来拦截手势并根据需要忽略它们。我应该覆盖哪种方法来做到这一点?

更新

我最后以不同的方式接近这个,即在每次更改手势时简单地调整表格视图的contentOffset。我担心这可能看起来“紧张”,但它实际上非常顺利。但是我会把问题保持开放,因为我仍然很好奇是否可以这样做。

2 个答案:

答案 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;
        }
    }
}

以下是窗口的外观,以了解展示位置:

enter image description here

答案 1 :(得分:0)

您可以通过设置:

禁用UITableView的滚动
table.scrollEnabled = NO;

如果您没有使用自定义手势,请启用它:

table.scrollEnabled = YES;

它是父类UIscrollView的属性:

  

如果此属性的值为YES,则启用滚动,如果为NO,则禁用滚动。默认值为YES。

     

禁用滚动时,滚动视图不接受触摸事件;它将它们转发给响应者链。