如何在视图转换后忽略触摸?

时间:2010-11-28 02:32:58

标签: iphone xcode ipad

我有两个视图,主视图我使用CALayers来做动画。此主图层处理触摸事件touchesBegan,touchesMoved和touchesEnded。

第二个视图是一个信息视图,它有自己的笔尖并包含应用程序指令。当用户双击主视图中的按钮时,我将信息视图翻转到......

if (infoView == nil) {
    NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"InfoView" owner:self options:nil];
    infoView = [ nibViews objectAtIndex: 0];
    [infoView retain];
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[self view] cache:YES];
[[self view] addSubview:infoView];
[UIView commitAnimations];

当用户点击信息视图中的按钮时,我将主视图翻转回原位...

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[self view] cache:YES];
    [infoView removeFromSuperview];
    [UIView commitAnimations];

我遇到的问题是,当我在信息视图中时,主视图仍然会接收到触摸(视图已被忽略)。信息视图中的按钮和文本字段正确响应触摸。

所以问题是,当信息视图被翻转到位时,如何禁止主视图接收触摸事件?

更新 看来我已经解决了我的问题,但在这个过程中创造了一个新问题。我尝试做的是用一个UIViewController管理两个UIVIews。我遇到的问题是主视图控制器加载了主视图,当我切换视图时,我添加了信息视图作为主视图的子视图。此层次结构显然导致未在可见信息视图中使用的触摸传递到主视图。

我通过让主视图控制器加载容器视图解决了这个问题。然后将主视图作为容器视图的子视图加载。当我在信息视图中翻转时,我将其添加为容器视图的子视图。现在,信息视图中出现的未使用的触摸将传递到容器视图,主视图永远不会看到它们。

但是,我创造了一个新问题。当主视图可见时,它仅在视图的上部接收触地事件。我可以在视图的上部触地并拖动到下部并接收触摸移动和被触摸的事件。我只是没有得到较低部分的触地事件。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

考虑使用presentModalViewController:animated:来展示你的第二个视图。您可以获得翻转效果,并且您不会遇到触摸问题,因为新的视图控制器将是第一个响应者,并自动处理所有触摸。

e.g。

MyInfoViewController* infoView = [[MyInfoViewController alloc] initWithNibName:@"MyInfoViewController" bundle:nil];
infoView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:infoView animated:YES];

您可以使用xcode的新文件命令轻松创建这个新的视图控制器和nib文件(创建一个UIViewController子类,并检查“使用nib”)

通过从主视图控制器调用[self dismissModalViewController];来关闭视图控制器。

您必须在两个视图控制器之间设置某种类型的通知或委托协议,以便当用户希望关闭时,您的信息视图控制器会通知您的主视图控制器。

您可以在xcode中查看Utility类型应用程序的模板项目,以获取此类确切的示例。

答案 1 :(得分:0)

我认为您可以在接收触摸事件时检查视图层次结构,然后评估是否可以接收此触摸或仅丢弃它。