2

所以,我遍历一个循环并创建UIView包含UIImageViews 的 s (这样我就可以有选择地显示任何给定的部分)。这些UIViews 都存储在一个UIScrollView.

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

当我运行程序时,只有最初在其中可见的项目才能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我对手势识别器在架构中的工作方式了解得不够多,无法理解这个问题。带有手势的滚动视图的Apple示例似乎没有这个问题,但我找不到任何真正的差异,除了我将我的嵌套UIImageViews在他们自己的UIViews

4

2 回答 2

5

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

于 2010-10-29T02:57:40.877 回答
2

尝试将cancelsTouchesInView属性设置为 NO。

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

  [imageholder addGestureRecognizer:gestRec];
于 2011-07-06T16:04:06.980 回答