ios - 当 UITableView 仍在垂直滚动时禁用 UITableViewCell 的水平滚动

标签 ios objective-c cocoa-touch uitableview

我在我的 UITableViewCell 子类上添加了一个 UIPanGestureRecognizer,这样当用户向左滑动时,下面的按钮就会显示出来(有点像在 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];

尽管我有自定义手势识别器,但我还是希望允许表格 View 滚动,因此我在同一个 UITableViewCell 子类中也有以下内容:

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

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


我试过的没用

方法一

在 TableView 的 View Controller 中实现 UIGestureRecognizerDelegate,并要求除了用于滚动 TableView 的垂直手势识别器之外的任何其他手势识别器失败。

  1. 将 TableView 的 panGestureRecognizer 的委托(delegate)设置为包含它的 View Controller (比如说它是 ContainingViewController)。

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

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

错误:“UIScrollView 的内置平移手势识别器必须将其 ScrollView 作为其委托(delegate)。”

最佳答案

创建一个 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,我会将手势识别器放在 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 等中放置类似的检查。 p>

关于ios - 当 UITableView 仍在垂直滚动时禁用 UITableViewCell 的水平滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838881/

相关文章:

iphone - 为什么 initWithNibName 不适用于我的 UIViewController 子类?

c# - 如何在没有源代码的情况下将 .ipa 或 .app 的体系结构从 arm64 更改为 i386

ios - 在 UIScrollView 中以编程方式调整 UITableView 的大小并避免 AutoLayout 约束

ios - 当我构建并运行一个空的ios应用时,xcode 5.0.1崩溃

iphone - ABRecordRef vCard

objective-c - Xcode:摆脱前向类警告

ios - 如何在 UIView 加载时执行我的方法?

ios - "affineTransform"是用于设置 CABasicAnimation 的有效 CALayer 键路径吗

ios - 如何获取 NSDocumentDirectory 中的目录列表?

ios - 模仿马车线最好的方法是什么?