UIWebView内部的UIScrollView消耗触摸事件

时间:2011-07-05 18:13:25

标签: objective-c ios cocoa-touch uiview uiscrollview

我在UIScrollView中有多个自定义UIWebView作为子视图。我已经在UIViewController中为UIWebView实现了触摸方法,但是没有调用这些方法。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { }
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { }
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { }

我在其他地方读过,它说UIScrollView会消耗这些事件。这是有道理的,但是如果UIWebView在UIScrollView本身之前没有收到触摸事件吗?可能发生的是,UIWebBrowserView(UIWebView的子视图)正在消耗这些事件。但是,这个类不能被子类化,因此我无法将超级视图链中的事件发送到UIScrollView。我已经在Apple iOS文档中读到,不应该在UIS​​crollView中放置UIWebView,但我需要这样做才能达到我的目的。

所以我的问题是:我的自定义UIWebView(即UIScrollView的子视图)如何接收触摸事件?

我的控制器和视图设置如下:

HomeViewController.h /.m /.xib
HomeView.h /.m (is a UIScrollView)
DashboardViewController.h /.m /.xib (custom UIWebView's)

HomeViewController从包含自定义视图的Nib文件加载:HomeView。 DashboardViewController从Nib文件加载。它包含一些标签,滑块等(请注意,这里没有自定义视图 - 我不是在这里继承UIView。)

HomeViewController动态加载多个DashboardViewControllers并将其视图添加到HomeView。

DashboardViewController *dashboardViewController = [[DashboardViewController alloc] initWithNibName:@"DashboardViewController" bundle:[NSBundle mainBundle];
[homeView addSubview:dashboardViewController.view];

5 个答案:

答案 0 :(得分:2)

您可能正在寻找canCancelContentTouches

scrollView.canCancelContentTouches = NO;

答案 1 :(得分:0)

您是否为所有子视图设置了userInteractionEnabled = YES

答案 2 :(得分:0)

用户互动已启用标准。

您是否将视图委托连接到文件所有者? 你是否将视图绑定到控制器?并确保将相应的操作连接到正确的方法。 (CTRL单击View并将加号拖到Class.h文件中的相应方法上。

@interface MyScrollView : UIViewController {
    UIView *myFirstView;
    UIView *mySecondView;
    UIView *myThirdView;
}

@property (nonatomic, retain) IBOutlet UIView *myView;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

@end

答案 3 :(得分:0)

UIViewController在UIView之前获取touches *消息。默认情况下,UIViewController不会将消息传递给UIView(通过调用[super touchesBegan])。因此,如果你的UIView有一个控制器,你需要移动或转发touches *函数。

我个人将各种touches *方法放在视图子类上,而不是视图控制器子类。

答案 4 :(得分:0)

你可以试试这个,当你依次为UIScrollView调用touches方法时,你可以在scrollview的子视图中调用相同的touches方法。