我有一个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 回答
bringSubviewToFront
在5.0上无法正常工作(在5.1上不需要黑客攻击)我不得不在按钮周围添加一个更大的透明度
UIButton
,就好像它被禁用来在5.1之前的iOS上修复它 .最后我发现,即使我用
CATransform3DMakeTranslation
和layer.zPosition
设置发回视图,触摸事件也会根据帧的位置进入视图 . 目前尚未见到的观点(被其他人覆盖)仍然触及 . 只为当前屏幕上的视图编写一行代码([self.superview bringSubviewToFront:self]
)解决了问题 .为了测试它并理解我所做的简单测试应用程序只有两个按钮 .
蓝色和黄色按钮 . 蓝色按钮覆盖黄色按钮,因此您只能在开头看到蓝色按钮 .
在蓝色按钮的内部代码修饰中,我只需将其发回
buttons.layer.zPosition = -1
. 在此之后,屏幕上没有可见的蓝色按钮部分,而我现在只看到黄色按钮,但是当我触摸黄色按钮(或者我想我正在触摸它)时,仍然会在代码运行中触摸蓝色按钮 .我不确定这是否是理想的逻辑但对我来说似乎不合理 .
正如我上面提到的,在将
zPosition
层设置为-1时写入[blueButton.superview sendSubviewToBack:blueButton]
可以正常工作 .