我有一个UIView的自定义子类和一个带有背景图像的全屏UIButton,如图所示, 在右侧,有一个带有UIImageView的UIView和一些其他不重要的标签和按钮。重要的是,在UIView上有两个滚动视图,在运行时,我在这些滚动视图上添加了UIButtons(不是小的,200 x 100)并启用了垂直滚动。 这种情况非常复杂,所以我会写出不同条件下发生的事情。在我的应用程序中,有10个完整的屏幕,在UIView的自定义子类上,我使用UIPanGestureRecognizer从一个滚动到另一个。我有充分的理由不使用滚动视图。所有窗口(下面的图像,而不是UIWindow)在循环中填充其内容,因此所有这些窗口的运行代码完全相同,并且所有窗口都是从相同的.xib文件创建的。最后一个信息,覆盖所有窗口的更大的UIButton有一个touchupinside动作,而scrollview中的小按钮有自己的touchupinside选择器。
我已经花了两天时间没有结果。这会导致什么行为?
编辑:在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
答案 0 :(得分:1)
bringSubviewToFront
在5.0上无法可靠地工作(在5.1上不需要黑客攻击)
我不得不在按钮周围添加一个更大的透明UIButton
,其行为就像是在5.1之前的iOS上被禁用来修复它。
答案 1 :(得分:0)
最后我发现,即使我使用CATransform3DMakeTranslation
和layer.zPosition
设置发回视图,触摸事件也会根据帧位置转到视图。目前还没有看到的观点(被其他人覆盖)仍然触及。只为当前屏幕上的视图编写一行代码([self.superview bringSubviewToFront:self]
)解决了问题。
为了测试这个并理解我在说什么,我做了一个只有两个按钮的简单测试应用程序。
蓝色和黄色按钮。蓝色按钮覆盖黄色按钮,因此您只能在开头看到蓝色按钮
在蓝色按钮的内部代码修饰中,我只需将其发送回buttons.layer.zPosition = -1
。在此之后,屏幕上没有可见的蓝色按钮部分,而我现在只看到黄色按钮,但是当我触摸黄色按钮(或者我想我正在触摸它)时,仍然会在代码运行中触摸蓝色按钮。
我不确定这是否是理想的逻辑但对我来说似乎不合理。
正如我上面提到的,在将图层[blueButton.superview sendSubviewToBack:blueButton]
设置为-1时写zPosition
可以按预期工作。