当UITableView仍然垂直滚动时,禁用UITableViewCell上的水平滚动

时间:2014-11-10 07:35:48

标签: ios objective-c cocoa-touch uitableview

我在UIPanGestureRecognizer子类上添加了UITableViewCell,以便当用户向左滑动时,会显示下面的按钮(类似于Mail应用中的按钮)。我在awakeFromNib

中执行此操作
// Add a pan gesture recognizer to the pannable view.
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panScrollView:)];
panGesture.delegate = self;
[self.pannableView addGestureRecognizer:panGesture];

我希望尽管我的自定义手势识别器允许滚动表视图,所以我在同一个UITableViewCell子类中也有以下内容:

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

我现在的问题是我不知道如何一次只允许一个手势识别器,因此当用户侧扫时,表格视图不会滚动,反之亦然。帮助


我尝试过的不起作用

方法1

在表格视图的视图控制器中实现UIGestureRecognizerDelegate,除了用于滚动表格视图的垂直手势识别器之外,还要求任何其他手势识别器失败。

  1. 将表格视图的panGestureRecognizer委托设置为包含它的视图控制器(比如ContainingViewController)。

    self.tableView.panGestureRecognizer.delegate = self;
    
  2. ContainingViewController实施UIGestureRecognizerDelegate

  3. 实施shouldRequireFailureOfGestureRecognizer:并返回YES(我假设otherGestureRecognizer将是水平平移手势)。
  4. 错误:' UIScrollView的内置平移手势识别器必须将其滚动视图作为其代理。'

3 个答案:

答案 0 :(得分:1)

创建一个bool,允许你的panGesture在panScrollView

中进行操作
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    self.blockPanGesture = YES;
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    self.blockPanGesture = NO;
}

然后

-(void)panScrollView:(UIPanGestureRecognizer *)panGestureRecognizer
{
    if(self.blockPanGesture == NO)
    {
       // do the stuff
    }
}

如果您正在平移整个桌面视图,我会将手势识别器放在tableView本身上......否则还有

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

    // Return YES if you want the specified item to be editable.
    return YES;
}

为您处理所有这些......但我假设您不想使用此功能。您也可以构建此逻辑,例如,您可能希望在scrollView也可以通过在-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView等中进行类似检查来进行调整。

答案 1 :(得分:1)

使用Magoo解决方案,我做了一些适合我的simillar。希望它可以帮到某人。

在Controller类中

#pragma mark - UIScrollViewDelegate methods

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{
    ApplicationDelegate.blockPanGesture = YES;
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    ApplicationDelegate.blockPanGesture = NO;
}

内部细胞:

- (IBAction)panGestureRecognizer:(UIPanGestureRecognizer *)panGesture
{
    if(ApplicationDelegate.blockPanGesture)
        return;

    // do your stuff

}

仅供参考:在Cell的xib文件中拖动UIPanGestureRecognizer并在IBOutletAction上创建| panGestureRecognizer:|

答案 2 :(得分:-2)

您是否尝试将跳出属性设置为NO?