【问题标题】:Disable horizontal scrolling on UITableViewCell when UITableView is still scrolling vertically当 UITableView 仍在垂直滚动时,禁用 UITableViewCell 上的水平滚动
【发布时间】:2015-01-06 11:11:41
【问题描述】:

我在UITableViewCell 子类上添加了UIPanGestureRecognizer,这样当用户向左滑动时,下方的按钮就会显示出来(有点像邮件应用程序中的)。我在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;
}

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


我尝试过的方法不起作用

方法一

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

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

     self.tableView.panGestureRecognizer.delegate = self;
    
  2. 使ContainingViewController 实现UIGestureRecognizerDelegate

  3. 实现shouldRequireFailureOfGestureRecognizer: 并返回YES(我假设otherGestureRecognizer 将是水平平移手势)。

错误:'UIScrollView 的内置平移手势识别器必须将其滚动视图作为其委托。'

【问题讨论】:

  • 嘿,马特,你能解决这个问题吗?因为我也面临同样的问题
  • 嗨,不 :( 我正在尝试其他方法,我会更新问题...
  • 通过一点点修改 Magoo 的建议解决了我的问题,让我发布我的解决方案

标签: ios objective-c cocoa-touch uitableview


【解决方案1】:

创建一个布尔值,允许您的 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,我会将手势识别器放在 tableView 本身...否则还有

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

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

它会为您处理所有这些...但我假设您不想使用它是有原因的。您也可以在此逻辑的基础上进行构建,例如,您可能希望调整滚动视图何时也可以拖动,方法是在 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 等中放置类似的检查。

【讨论】:

    【解决方案2】:

    使用 Magoo 解决方案,我做了一些对我有用的类似操作。希望它可以帮助某人。

    在控制器类中

    #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
    
    }
    

    仅供参考:已将 UIPanGestureRecognizer 拖入 Cell 的 xib 文件并在 IBOutletAction |panGestureRecognizer:| 上方创建

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 2014-05-05
        • 2019-04-23
        • 2021-11-13
        相关资源
        最近更新 更多