iPhone - 在UIScroller中的UIView ...查看没有将触摸传递给父级

时间:2011-05-15 01:22:02

标签: iphone

我在UIScroller中有一个UIView(让我们称之为myView)。

myView包含可以拖动的元素。

当触摸其中一个元素时,滚动条被锁定,以防止整个滚动。元素具有exclusiveTouch = YES。我只需触摸myView即可滚动整个内容。

我使用touchesBegan,touchesMoved等工作,但我正在将这个类转换为手势。新类附加了两个手势:UIPanGestureRecognizer和UITapGestureRecognizer。类似的东西:

 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] 
           initWithTarget:self action:@selector(drag:)];
 [panGesture setMaximumNumberOfTouches:1];
 [panGesture setDelegate:self];
 [myView addGestureRecognizer:panGesture];
 [panGesture release];


 UITapGestureRecognizer *singleTap =  [[UITapGestureRecognizer alloc] 
                initWithTarget:self 
                action:@selector(tapAdd:)];
 [singleTap setDelegate:self];
 [singleTap setNumberOfTapsRequired:1];
 [myView addGestureRecognizer:singleTap];
 [singleTap release];

当这个类使用旧方法(touchesBegan等)时,我只是使用类似

之类的东西转发触摸
[self.nextResponder touchesBegan: touches withEvent:event]; 

但是如何使用手势来做到这一点?我的意思是,在我的情况下,UIPanGestureRecognizer将运行一个名为drag的方法:此方法接收一个手势...如何将触摸转发到其滚动父级,所以整个事情滚动?

感谢

1 个答案:

答案 0 :(得分:1)

你可以设置一个协议来代表你的观点。

在标题中,设置

@protocol MyViewDelegate
- (void)drag;
@end

@interface ....... {
    id <MyViewDelegate> delegate;
}
@property (nonatomic, assign) id delegate;
@end

您必须在实现文件中合成delegate。 在scroller类中,您必须使用协议

@interface Scroller ....... <MyViewDelegate> {

在该实施文件中,请确保在初始化时添加myView.delegate = self;并添加- (void)drag {并在其中执行您想要的操作。如果您需要更多信息,您当然可以将协议中的方法指定为- (void)dragWithEvent:(UIEvent *)event或类似的方法。

然后,当您在myView中调用drag:时,可以通过调用[self.delegate dragWithEvent:event];将其转发给协议方法。

我意识到让滚动条滚动有点广泛,但它会像你想要的那样转发信息。

也可以将手势添加到滚动条而不是myView,然后转发touchesBegan方法中的所有触摸并让滚动条直接处理