我正在编写一个ipad应用程序,您可以用1或2个手指在屏幕上拖动。我使用touchesBegan,touchesMoved和touchesEnded方法来识别触摸。我为视图启用了多个小时。
现在我已经认识到一种奇怪的行为。如果我将手指放在屏幕上方边框之外并将其向下拖动到屏幕上,我将不会接到对touchesBegan或touchesMoved的调用。这无法在其他屏幕边框上重现。
可以复制的唯一其他情况是当我使用横向方向时,主页按钮位于左侧。在这种情况下,我得到上屏幕边框相同的行为。
有关于此的任何信息,或者在测试时是否有相同的经验?
编辑: 我做了一些额外的测试。状态栏通常是接收touchesBegan或touchesMoved的区域非常精细,如果我放下手指在该区域或从任何较低的屏幕位置向上滑动。仅当我从完全位于屏幕边缘上方的位置向下滑动手指时才会识别输入。
EDIT2: 附加信息: - 我的应用程序使用OpenGL视图。 - 状态栏已隐藏。 - 触摸所有方向的(隐藏)状态栏区域时,touchesBegan被正确调用。
答案 0 :(得分:3)
我认为潜在的问题是屏幕上的触敏层在可见屏幕上方延伸了几个像素,这意味着从那里开始的触摸在技术上从UIViewController视图之外开始。由于您的UIViewController只能看到源自其视图的触摸,因此它不会看到这些触摸。因此,如果您的设备屏幕被触摸到可见像素上方的一两个像素,则触摸将被发送到该屏幕外区域中存在的任何虚拟层(可能是状态栏?)。这可以防止你的UIViewController接收任何触摸,因为滑动不是源自你的UIViewController的视图区域。
要解决这个问题,在applicationDidLaunch时,您可以调整UIWindow的大小(比方说)每边大10个像素,并在其中创建一个中间的UIViewController“背景”图层,与窗口的扩展大小相匹配。然后将主界面UIViewController视图设置为“背景”视图的子视图,在所有边上插入10个像素以重新匹配物理屏幕大小。如果界面旋转,则必须在背景UIViewController中的willAnimateRotationToInterfaceOrientation方法中重新应用背景视图的10像素放大。
最后,让后台视图控制器中的touchesBegan / Moved / Ended方法将其触摸直接转发到主UI视图控制器中的相应方法。瞧!
希望这有帮助, 本
答案 1 :(得分:0)
听起来对我不错。如果您首先在状态栏上拖动手指,它将接收此手指的所有触摸事件,直到您抬起它。所有触摸事件都会传递到触摸开始的视图中。
答案 2 :(得分:0)
遗憾的是,无法从状态栏区域调用touchesBegan。