【发布时间】:2010-10-22 08:39:00
【问题描述】:
我有一个视图层次结构,其中包含滚动视图上的较小视图。每个视图都可以有子视图,例如按钮等。
由于某种原因,视图上的按钮没有被点击;进一步探索表明,当滚动视图接收到 touchBegan 事件时,按钮没有。调用 hitTest:event: 消息显示按钮未返回,即使它在限制范围内。
我已经包含了一个日志输出,描述了滚动视图上的触摸位置、从 hitTest 返回的项目、如果我调用 locationInView 时的触摸位置:使用预期项目,以及预期项目的层次结构(打印框架) .从这个输出中我可以推断出按钮 应该 已经被调用了......
谁能解释一下?我错过了什么吗?
touched ({451, 309}) on <VCViewContainersView: 0x4b31ee0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x4b32130>> (location in expected item: {17, 7.5})
expected touched item is:
view: <UIButtonLabel: 0x482b920; frame = (32 5; 36 19); text = 'Click'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x4831370>>, layer transform: [1, 0, 0, 1, 0, 0]
view: <UIRoundedRectButton: 0x482c100; frame = (50 50; 100 30); opaque = NO; layer = <CALayer: 0x482c450>>, layer transform: [1, 0, 0, 1, 0, 0]
view: <UIImageView: 0x480f290; frame = (0 0; 320 255); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x480e840>>, layer transform: [1, 0, 0, 1, 0, 0]
view: <VCViewContainer: 0x4b333c0; frame = (352 246.5; 320 471.75); layer = <CALayer: 0x4b33d50>>, layer transform: [1, 0, 0, 1, 0, 0]
view: <UIScrollView: 0x4b32600; frame = (0 0; 1024 748); clipsToBounds = YES; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x4b32780>>, layer transform: [1, 0, 0, 1, 0, 0]
view: <VCViewsContainerView: 0x4b31ee0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x4b32130>>, layer transform: [0, 1, -1, 0, 0, 0]
view: <UIWindow: 0x4b1d590; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x4b1d6d0>>, layer transform: [1, 0, 0, 1, 0, 0]
更新:除了 UIWindow 和 VCViewsContainerView,所有视图都是使用 initWithFrame: 或在按钮的情况,buttonWithType:。 VCViewContainer 使用 CGRectZero 进行初始化,当创建 UIImageView 时,其框架设置为图像大小 + 底部标签的额外空间。
更新 2:当使用相同的位置调用 [self.layer hitTest:location] 时,我得到了 正确 视图的层!这是怎么回事……?
【问题讨论】:
-
UIRoundedRectButton 是按钮。
-
我们需要看看您是如何创建视图层次结构的...InterfaceBuilder、代码等...
-
@KennyTM:如果不清楚,它会说“在(实际触摸的项目)上触摸(位置)”。请注意,触摸的项目是 VCViewContainerView 而不是 UIRoundedRectButton。
-
@jv42:我已经添加了解释;添加代码是一种耻辱,因为它分散在所有地方。如果你仍然需要代码,我会破解一些东西。