【问题标题】:CollectionViewCell with pan gesture recognizer带有平移手势识别器的 CollectionViewCell
【发布时间】:2014-07-19 19:17:09
【问题描述】:

我已经使用UIPanGestureRecognizer 设置了我的UICollectionViewCell,它应该像您在UITableViewCells 中经常看到的那样工作,它显示了内容下方的控件。我的问题应该同时适用于UICollectionViews 和UITableViews。

我让它工作,以便单元格中的水平平移与UICollectionView 的垂直平移同时工作。只需实现UIGestureRecognizer 的此委托方法即可启用:

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

这允许它们同时工作,但它也有副作用,当我在UICollectionView 中垂直平移时,任何轻微的水平移动都会触发我在启动时碰巧触摸的单元格中的gestureRecognizer垂直平移,从而显示底层控件。我不想要这个。

Mail 完美地处理了这个问题,因此 fx. UITableView 中的垂直平移,禁用单元格中的任何水平平移手势,反之亦然。

我可以通过正确设置手势识别器以简单的方式实现这一目标吗?

我想避免必须管理视图之间状态的解决方案(“滚动视图正在拖动”、“单元格正在拖动”等)。

【问题讨论】:

    标签: ios objective-c uitableview uicollectionview uigesturerecognizer


    【解决方案1】:

    此问题的解决方案可以在 WWDC 2014 视频中看到:“高级滚动视图和触摸处理技术”。在他们解释如何在使用多个触摸滚动时实现拖动的部分中。这个想法是禁用然后重新启用您不想与当前工作的手势识别器并行运行的手势识别器。在您的情况下,您需要将collectionView 和tableView 子类化,以便override 他们实现平移手势识别器。

    【讨论】:

    【解决方案2】:

    第一:

    我让它工作,以便单元格中的水平平移与 CollectionView 的垂直平移同时工作。只需实现 UIGestureRecognizer 的这个委托方法即可启用。

    稍后:

    Mail 完美地处理了这个问题,因此 fx. TableView 中的垂直平移,禁用单元格中的任何水平平移手势,反之亦然。

    您要求两种相反的行为。决定你希望你的应用实现哪一个。

    如果您希望手势同时工作(IMO 设计不佳),请在代码中保留 gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:。

    如果您希望它们像在邮件应用程序中一样工作(它们通常在表格视图中的工作方式),请删除有问题的代码行。

    此外,在表格视图中实现这一点的方式是使用滚动视图。所以你可能想调查一下。

    【讨论】:

    • 如果我删除委托调用(或有效地返回 NO),滚动视图识别器将完全锁定,因此无法解决任何问题。在单元格中使用滚动视图实现它可能是一种选择,但我仍然会有冲突的手势识别器。
    • 看起来滚动视图是要走的路,而不是手势识别器。它解决了手势识别器冲突,但产生了一些其他问题。不过,它们似乎可以修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多