2011-12-15 91 views
1

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

  • 我的一些窗户完美的作品,如果我在屏幕上的任何位置触摸,更大的按键动作被调用,如果我触摸和拖拽,滚动作品和我导航到下一个/上一个窗口,如果我碰在滚动视图中的小按钮上,他们的动作被触发,最后我可以在这些按钮内完美滚动。
  • 我的一些窗口,当我尝试滚动滚动视图时,更大的窗口pangesturerecognizer捕获此事件不是小滚动视图,如果我触摸该滚动视图中的小按钮,更大的按钮事件被触发(它通过所有通过uibutton> uiscrollview> uiimageview> uiview在按钮像他们不存在的UIBUTTON)
  • 如果我更换正确的容器视图大uibutton上的一些其他位置,它随机运行良好与否,有时其中一个scrollviews工程好,其他不好。
  • 它具有一致的行为,如果在一个位置,它的工作原理,它总是有效的,如果不是,它就不会。
  • 同样,所有的视图和子类都启用了它们的用户交互,是的,相反已经变得不可行了,因为行为只是根据大的uibutton上的容器视图的位置而改变,并且也根据大的uibuttons背景图像而改变。
  • 我已经放置了touchesBegan方法仅用于测试目的,当触摸无法按预期工作时,使用touch.view触发的事件是大按钮的容器,即使我触摸滚动视图中的小按钮。

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

编辑: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

我不想让你失望,但我会说你的问题是复杂的方式,对于详尽的答案来说信息太少。有很多事情可能会出现问题,因此无法分辨问题是什么。可能是错误地连线的事件处理程序,混淆了视图的z顺序,UIScrollView的某些属性设置不正确。 我建议调试的基础知识:简化它。分解它。删除不必要的控件重新思考你的设计。重来。 – Krumelur 2011-12-15 01:43:37

回答

0

我总算想通了,即使我送回来CATransform3DMakeTranslationlayer.zPosition设置的意见,触摸事件去根据其框架位置查看视图。目前甚至没有看到(被其他人覆盖)的观点仍然存在。为当前屏幕上的视图编写一行代码([self.superview bringSubviewToFront:self])解决了问题。

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

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

正如我上面提到的那样,将[blueButton.superview sendSubviewToBack:blueButton]设置为zPosition设置为-1时,按预期工作。

1

bringSubviewToFront没有对5.0可靠地工作(5.1是没有必要的黑客)

我不得不添加一个更大的transparrent UIButton围绕其行为,如果它被禁用,以解决这一问题上的iOS 5.1之前的按钮。