uiscrollview和uibutton对触摸事件表现透明

时间:2011-12-15 00:15:59

标签: cocoa-touch uiscrollview uibutton

我有一个UIView的自定义子类和一个带有背景图像的全屏UIButton,如图所示, 在右侧,有一个带有UIImageView的UIView和一些其他不重要的标签和按钮。重要的是,在UIView上有两个滚动视图,在运行时,我在这些滚动视图上添加了UIButtons(不是小的,200 x 100)并启用了垂直滚动。 这种情况非常复杂,所以我会写出不同条件下发生的事情。在我的应用程序中,有10个完整的屏幕,在UIView的自定义子类上,我使用UIPanGestureRecognizer从一个滚动到另一个。我有充分的理由不使用滚动视图。所有窗口(下面的图像,而不是UIWindow)在循环中填充其内容,因此所有这些窗口的运行代码完全相同,并且所有窗口都是从相同的.xib文件创建的。最后一个信息,覆盖所有窗口的更大的UIButton有一个touchupinside动作,而scrollview中的小按钮有自己的touchupinside选择器。

  • 我的一些窗户工作得很完美,如果我触摸屏幕上的任何地方,会调用更大的按钮动作,如果我触摸并拖动,滚动工作,我导航到下一个/上一个窗口,如果我触摸较小的按钮在滚动视图中,他们的动作被触发,最后我可以在这些按钮内完美滚动。
  • 我的一些窗口,当我尝试滚动滚动视图时,较大的窗口pangesturerecognizer捕获此事件而不是小滚动视图,如果我触摸滚动视图中的小按钮,则会触发更大的按钮事件(它会全部通过通过uibutton> uiscrollview> uiimageview> uiview到按钮上的uibutton就像它们不存在一样)
  • 如果我替换右侧容器查看大型uibutton上的其他位置,它随机运行良好与否,有时其中一个滚动视图效果很好而另一个没有。
  • 它具有一致的行为,如果在一个位置,它起作用,它总是有效,如果不是,它永远不会。
  • 同样,所有视图和子类都启用了用户交互是,相反已经不可能了,因为行为仅根据容器视图在大uibutton上的位置而改变,并且还根据大的uibuttons背景图像进行更改。
  • 我只为测试目的放置了touchesBegan方法,当触摸不能按预期工作时,触摸事件触发的事件是大按钮的容器,即使我触摸了滚动视图中的一个小按钮

我已经花了两天时间没有结果。这会导致什么行为?

编辑:在krumelur的评论之后我把注意力从配置这些视图改为动画我给容器视图,我注意到了,问题是关于动画,我添加了代码部分动画所有十个窗口,其行为类似于自定义滚动视图。所有窗口都有自己的自定义图层类,当我抓住pangesture识别器时,我会使用以下代码在屏幕上移动窗口。该代码中的项目是一个包含所有窗口层的数组。动画导致了这种奇怪的情况,但我还是想不通..

- (void)layoutSublayers {
[super layoutSublayers];

[CATransaction begin];
[CATransaction setDisableActions:YES];

float angleDelta = 2 * M_PI / [items count];
float a = angle;

for (UIBaseLayer *l in items) {

    l.position = self.position;  

    CATransform3D translation = CATransform3DMakeTranslation(cosf(a)*(radius.x), 1.0, (sinf(a)*radius.y) - radius.y*1.0);

    float dailyAngle = (M_PI_2 - a);
    CATransform3D rotation = CATransform3DMakeRotation(dailyAngle, 0, 1.0, 0);
    CATransform3D t = CATransform3DConcat(rotation, translation);
    l.transform = t;

    a += angleDelta;
}
[CATransaction commit];}

http://img836.imageshack.us/img836/296/screenshot20111215at013.png

2 个答案:

答案 0 :(得分:1)

bringSubviewToFront在5.0上无法可靠地工作(在5.1上不需要黑客攻击)

我不得不在按钮周围添加一个更大的透明UIButton,其行为就像是在5.1之前的iOS上被禁用来修复它。

答案 1 :(得分:0)

最后我发现,即使我使用CATransform3DMakeTranslationlayer.zPosition设置发回视图,触摸事件也会根据帧位置转到视图。目前还没有看到的观点(被其他人覆盖)仍然触及。只为当前屏幕上的视图编写一行代码([self.superview bringSubviewToFront:self])解决了问题。

为了测试这个并理解我在说什么,我做了一个只有两个按钮的简单测试应用程序。
蓝色和黄色按钮。蓝色按钮覆盖黄色按钮,因此您只能在开头看到蓝色按钮 在蓝色按钮的内部代码修饰中,我只需将其发送回buttons.layer.zPosition = -1。在此之后,屏幕上没有可见的蓝色按钮部分,而我现在只看到黄色按钮,但是当我触摸黄色按钮(或者我想我正在触摸它)时,仍然会在代码运行中触摸蓝色按钮。

我不确定这是否是理想的逻辑但对我来说似乎不合理。

正如我上面提到的,在将图层[blueButton.superview sendSubviewToBack:blueButton]设置为-1时写zPosition可以按预期工作。