UIWebView 在 UIScrollView 内消耗触摸事件

Posted

技术标签:

【中文标题】UIWebView 在 UIScrollView 内消耗触摸事件【英文标题】:UIWebView's inside UIScrollView consuming touch events 【发布时间】:2011-07-05 18:13:24 【问题描述】:

我在 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 的子视图)正在使用这些事件。然而,这个类不能被子类化,所以我不能将事件沿着 superview 链发送到 UIScrollView。我在 Apple ios 文档上阅读过,不应该将 UIWebView 放在 UIScrollView 中,但出于我的目的,我需要这样做。

所以我的问题是:我的自定义 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 动态加载多个 DashboardViewController 并将其视图添加到 HomeView。

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

【问题讨论】:

【参考方案1】:

您可能正在寻找canCancelContentTouches

scrollView.canCancelContentTouches = NO;

【讨论】:

【参考方案2】:

用户交互是标准启用的。

您是否将视图委托连接到文件所有者? 您是否将视图绑定到控制器?并确保将相应的操作连接到正确的方法。 (CTRL 单击视图并将加号拖到 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

【讨论】:

是的,我的意见委托已连接到文件的所有者。你是什​​么意思将我的视图绑定到控制器?此外,我已将 UIScrollView 子类连接为 Controller 的主视图。查看我更新的帖子;我添加了一些可能有帮助的更多信息。谢谢。 此解决方案不起作用,因为 UIWebBrowserView(不是 UIWebView)似乎会接收触摸事件。然而,这个类不能被子类化来改变功能。【参考方案3】:

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

【讨论】:

userInteractionEnabled 默认启用。 糟糕。以为默认是NO。滚动视图上的 contentSize 可能吗?【参考方案4】:

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

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

【讨论】:

这里的问题是我没有将 UIView 子类化为 UIScrollView 中的子视图。我只是使用从 Nib 生成的视图。查看我更新的帖子;我添加了一些可能有帮助的更多信息。谢谢。【参考方案5】:

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

【讨论】:

以上是关于UIWebView 在 UIScrollView 内消耗触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中的 UIImageView 和 UIWebView

UIWebview 和 UIScrollview

UIWebView 上的 UIScrollView 和 UITapGestureRecognizer 冲突

在 UIScrollView 内滚动时,调整大小的 UIWebView 返回到原始大小

UIScrollview 高度变化基于 Uiwebview 内容

在 UIScrollView 中使用多个 UIWebView