【问题标题】:UIGestureRecognizer not called after setting UIViews frame inside UIScrollView在 UIScrollView 内设置 UIViews 框架后未调用 UIGestureRecognizer
【发布时间】:2016-06-16 14:51:57
【问题描述】:

我遇到了一些非常奇怪的问题。基本上,我正在实现一个拖放视图,并与水平一维网格对齐。好吧,所以当我拖动一个视图并且它的中心坐标 X 大于或小于另一个视图时,未拖动的视图应该在其原始位置的左侧或右侧进行动画处理。

这在大多数情况下都可以正常工作。但在某些特殊情况下,它不起作用。在某些特定情况下,视图不再接收任何手势回调。我可以重现此问题,并发现当我删除应用动画的代码时,一切正常。

基本上这是当被拖动的视图位于下面的视图应该向左或向右移动的位置时调用的代码

/**
 * Animate element to its saved position
 */
- (void)switchElement:(unsigned int)draggedIndex with:(unsigned int)otherIndex
{       
    // first animate
    UIView *view      = views[draggedIndex];
    UIView *otherView = views[otherIndex];
    // IF I COMMENT THIS OUT, EVERYTHING WORKS FINE 
    otherView.frame = [self getImageRectForIndex:draggedIndex];
    // now switch internally
    if(draggedIndex != otherIndex)
    {
        // switch views 
        views[draggedIndex]      = otherView;
        views[otherIndex] = view;
    }
}

如果我为 UIView 设置动画并附加手势识别器,是否有什么需要考虑的?

如果有人愿意,我可以把全班贴在这里测试一下。

解决方案 我的设计中有一些“亮点”观点。我无意中将相关视图移到了那些透明背景视图后面。所以现在我不使用addSubview:,而是使用insertSubview:atIndex:

但是将@Anthonin C. 的答案标记为正确的答案。因为它为我指明了正确的方向(我通过覆盖 hitTest: 方法找到了它)

【问题讨论】:

  • 您的动画是否阻碍了用户交互?搜索 UIViewAnimationOptionAllowUserInteraction,它可能会对您有所帮助。例如stackoverflow.com/questions/5181216/…
  • 好吧,我简化了代码。它没有连接到动画。因为直接设置框架似乎也屏蔽了所有手势回调
  • 我用一个简单的例子创建了一个仓库

标签: ios objective-c iphone uiview drag-and-drop


【解决方案1】:

请您跟踪 otherView.bounds 属性以验证您的触摸是否超出范围。我最近遇到了这个问题,Apple 文档在这里提供了解决方案:Delivering touch events to a view outside the bounds of its parent view

抱歉,我没有足够的声誉来评论您的回答。

【讨论】:

  • 已经这样做了。我正在跟踪框架和 userinteractionenabled 标志。一切看起来都很好
  • mh,但是这篇文章是一个很好的参考.. 为我指出了一些有趣的方向.. 稍后将粘贴我的结果
  • 谢谢 :) 但我已经找到了。我正在将视图移到另一个视图后面。您为我指明了正确的方向!
  • 太棒了!很高兴有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2012-04-18
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多