首页 文章

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

提问于
浏览
1

我有一个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背景图像进行更改 .

  • 我已经为测试目的放置了touchesBegan方法,当触摸不能按预期工作时,使用touch.view触发的事件是大按钮的容器,即使我触摸了滚动视图中的一个小按钮 .

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

编辑:在krumelur的评论之后,我已经将注意力从配置这些视图改为动画我给容器视图,我注意到,问题是关于动画,我正在添加动画所有的代码部分十个窗口,其行为类似于自定义滚动视图 . 所有窗口都有自己的自定义图层类,当我 grab 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 回答

  • 1

    bringSubviewToFront 在5.0上无法正常工作(在5.1上不需要黑客攻击)

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

  • 0

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

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

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

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

相关问题