UITapGestureRecognizer只在初始化阶段在舞台上可见的项目工作

所以,我遍历一个循环,并创build包含UIImageViewUIView (这样我可以select性地显示任何给定的部分)。 这些UIView都存储在一个UIScrollView

我将手势识别器添加到创build它们的循环中的UIView

当我运行程序时,只有在UIScrollView最初可见的项目才能识别其手势。 如果我滚动到以前隐藏的项目,然后点击它们,什么也没有发生(手势永远不会被识别或尝试)。

初始化代码:

 UITapGestureRecognizer* gestRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; gestRec.delegate = self; [imageholder addGestureRecognizer:gestRec]; 

处理手势的代码:

 - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer { float count = [self._imageHolders count]; NSLog(@"handling gesture: %f",count); while(count--){ UIView* object = (UIView*) [self._imageHolders objectAtIndex:count]; // NSLog(@"Whats going on: %@, %@, %b",object,gestureRecognizer.view, object == gestureRecognizer.view); if(object == gestureRecognizer.view){ object.alpha = .1; count = 0; } // [object release]; } } 

有任何想法吗?

—-更新:

我已经在scrollviewUIView和手势识别器中探索了各种可用的函数,并且尝试了在这种情况下切断边界的情况。有趣的是,如果有一个项目只有部分可见,它完全可见,只有原本可见的部分才能识别任何手势。

我不太了解UIKit体系结构中的手势识别器如何工作来理解这个问题。 用手势滚动视图的苹果示例似乎没有这个问题,但我找不到任何真正的差异,除了我在我自己的UIViews嵌套我的UIImageViews

我有一个类似的问题,并发现这是由于将子视图添加到顶级视图,然后将该顶级视图添加到滚动视图引起的。 顶级视图的尺寸必须与scroll-view的contentSize(不是边界)相同,否则即使滚动到视图中,也不会将触摸事件传递给子视图。

尝试将cancelsTouchesInView属性设置为NO。

 UITapGestureRecognizer* gestRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; gestRec.delegate = self; **gestRec.cancelsTouchesInView = NO;** [imageholder addGestureRecognizer:gestRec];