UIWebView内部的UIScrollView消耗触摸事件

5

我在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。我在苹果 iOS 文档中读到,永远不应该将 UIWebView 放置在 UIScrollView 中,但出于我的目的,我必须这样做。
所以我的问题是:如何使我的自定义 UIWebView(它们是 UIScrollView 的子视图)接收触摸事件?
我的控制器和视图设置如下:
HomeViewController.h /.m /.xib
HomeView.h /.m (is a UIScrollView)
DashboardViewController.h /.m /.xib (custom UIWebView's)

HomeViewController是从一个包含自定义视图HomeView的Nib文件中加载的。DashboardViewController也是从一个Nib文件中加载的,它包含一些标签、滑块等(请注意这里没有自定义视图 - 我在这里没有子类化UIView)。

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

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

2

0

用户交互已启用标准模式。

您是否将视图委托连接到文件所有者?并且是否将您的视图绑定到控制器?请确保将相应的操作连接到正确的方法上。(在View上按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子类连接为控制器的主视图。请查看我的更新帖子;我添加了一些可能有用的信息。谢谢。 - mdupls
这个解决方案行不通,因为UIWebBrowserView(而不是UIWebView)似乎会捕捉到触摸事件。然而,这个类不能被子类化以改变功能。 - mdupls

0
你可以尝试这个方法,当UIScrollView按顺序调用touches方法时,你可以从scrollview中调用相同的touches方法来处理子视图。

0

你是否已经为所有的子视图设置了userInteractionEnabled = YES


userInteractionEnabled 默认情况下是启用的。 - Jules
哎呀,我以为默认是NO。也许是scrollView上的contentSize? - Warren Burton

0

在 iOS 编程中,UIViewController 在 UIView 之前接收 touches* 消息。默认情况下,UIViewController 不会将消息传递给 UIView(通过调用 [super touchesBegan])。因此,如果您的 UIView 具有控制器,则需要移动或转发 touches* 函数。

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


问题在于我没有为UIScrollView中的子视图子类化UIView。我只是使用从Nib生成的视图。请查看我的更新帖子;我添加了一些可能有帮助的更多信息。谢谢。 - mdupls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接