添加 SubView 后在 SuperView 中获取 Touches

Posted

技术标签:

【中文标题】添加 SubView 后在 SuperView 中获取 Touches【英文标题】:Get Touches in SuperView after adding SubView 【发布时间】:2012-03-23 01:43:21 【问题描述】:

从 XCode 4.2 中的 Single View ios 模板开始,我在 .xib 中添加了第二个视图,主视图上的“超级”按钮和子视图上的“子”按钮。我希望能够同时点击这两个按钮。

在视图控制器的界面中,我添加了:

IBOutlet UIView *subView;

然后在我的视图控制器的 viewDidLoad 方法中,我添加:

 [self.view addSubview:subView];

在[super viewDidLoad]之后;

subView 的背景为“clear”,两个窗口都设置为“User Interaction Enabled”。

当我运行应用程序时,只有“子”按钮是可点击的。我可以看到“超级”按钮,但它似乎没有收到触摸,据我从 Apple 的文档中可以看出,这应该是默认行为(视图的透明区域应该允许触摸通过)。

【问题讨论】:

【参考方案1】:

这不是发生的事情,如果你把一个视图放在另一个视图前面,后面的视图将不会收到触摸。

您可以在前视图中禁用用户交互,因此后视图将接收到触摸。

但我认为您希望前视图和后视图可点击,在这种情况下您需要做的是获取触摸并将其发送到后视图,并在后视图中处理它。

我不知道你想做什么,但我认为,你可能可以做出比这更好的选择。

您可以在 *** 中查看这个问题: detect touch on a view behind another view?

编辑:

你有很多选择来发送触摸。

你可以这样做(这不是一个好的选择):

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    for (UITouch *touch in touches)         
        for(UIView* v in self.view.subviews)
            if([v pointInside:[touch locationInView:self.view] withEvent:event])
                if ([v isKindOfClass:[UIButton class]]) 
                    [(UIButton*)v sendActionsForControlEvents:UIControlEventTouchUpInside];
                

            
        
        

您还可以编辑视图框架,使视图不会覆盖按钮。

您还可以将按钮带到新子视图的前面,执行以下操作:

[self.view addSubview:yourSubview];
[self.view bringSubviewToFront:yourButton];

你只需要发挥你的创造力;)

【讨论】:

【参考方案2】:

您的第二个视图是内容(按钮)的大小还是整个视图的大小?您可能会发现将子视图设置为对象的大小比 320x480 更容易。然后在将其添加为子视图后通过 cgrectmake 对其进行对齐。

这比冒泡各种触摸更容易,这有点像噩梦。

【讨论】:

是整个视图的大小。对于这个项目,将其设为小视图会起作用,但我很想学习如何正确地为全屏叠加层添加修饰。

以上是关于添加 SubView 后在 SuperView 中获取 Touches的主要内容,如果未能解决你的问题,请参考以下文章

关于 subview 在 Objective-C 中保留 superview 的问题

超出superView的subview响应方法

如何用户 XIB 使 SuperView 匹配 Subview 的框架? (Xcode 8)

我可以在 superView 中的特定点获取 subView 吗?

为啥我的 superview-with-subview 在模态显示(使用自动布局)时会缩小?

请问如何阻止一个手势事件向父类传递?