【问题标题】:iOS Touches (Auto) Offset on iPadiPad 上的 iOS 触摸(自动)偏移
【发布时间】:2011-12-13 20:22:07
【问题描述】:

几乎没有关于此的信息,所以这是我的问题:

我正在开发一款 2 人“坐在对面”的 ipad 游戏,而坐在对面的玩家很难点击按钮……因为 Apple 似乎会根据设备方向(非常适合常规使用或主要播放器)。有没有办法重置它或告诉ipad不要这样做? (顺便说一句,iPhone 也这样做)

这就是我找到的所有内容: 鉴于这种明显的不一致,我决定通过打开移动部件的“边界”来欺骗它,以便在部件区域下方有一个区域供用户点击。总体而言,用户似乎是在物体下方而不是物体上方击中 - 所以不要注意到 iOS 引起的移动。

因此,如果没有简单的方法来防止偏移,那么为对方玩家移动每个 uiview(或子类)边界的唯一解决方案是什么?或者这是否正确?

感谢任何答案。

【问题讨论】:

    标签: iphone ipad bounds touches touch-event


    【解决方案1】:

    编辑:天哪,我终于找到了方法!我创建了 UIView 的子类,并让我的游戏视图(包含所有 UIScrollView、UIButton 等)使用该子类。然后这是我添加到子类的唯一代码:

    -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        CGPoint touchSpot = point;
        if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"] && touchSpot.y < 512)
        {
            touchSpot = CGPointMake(touchSpot.x, touchSpot.y+10);
        }
    
        UIView *hitView = [super hitTest:touchSpot withEvent:event];
    
        if (hitView == self)
            return self; // you can return nil here if you want touches to go through this view (ie transparent space in a HUD overlay or w/e)
    
        return hitView;
    }
    

    到目前为止,这一切都很好......坐在另一端的人与“家”侧的玩家一样具有良好的触摸响应。但请注意不要在此视图之上呈现视图...一切都将通过该方法...

    旧解决方案(在我发现之前 ^):

    好吧,现在我的解决方案是继承uigesturerecognizer,转发任何触摸(即对识别器没有限制),然后将其添加到我的游戏视图中。然后响应任何触摸的方法仅在状态为 Ended 时运行,如果是,则继续循环遍历每个子视图(不是很多)以查看触摸是否与一个相交。同样,对于对方玩家,它会比较稍微偏移的矩形(对于每个子视图)。

    我会看看能不能找到更有效的方法……但目前还可以。

    我也可以将我的游戏视图设为 uiview 子类并覆盖 touchesbegan/moved/ended,但我已经将它们全部放置好,所以我使用了识别器(因此不必继承 uiview)。

    【讨论】:

      【解决方案2】:

      是的,触摸偏移确实存在,它的大小没有记录并且不能取消(至少,使用公共 API)。

      您必须对偏移量本身进行逆向工程。我会在 UIKit 所说的触摸处显示一个小圆圈,然后通过反复试验来调整它。当您有偏移量时,您可以在事件处理程序中手动应用它(-2 * 偏移量),仅针对对方玩家。

      我不知道它会有多正确感觉,你必须尝试一下。

      【讨论】:

      • 正确的触摸我跟踪自己我可以做到这一点,但是对于 UIButtons 或 tableview 上不受我控制的东西呢?他们已经清除了错过的触摸。对此有何建议?谢谢。
      • 要影响所有触摸,您必须在 UIWindow/UIApplication 级别覆盖 sendEvent:,但无论如何您都不能修改 UITouches。这里的问题是,为了“修复”Apple 的触摸调整机制(很可能发生在驱动程序级别)无处不在,您必须使用如下所述的私有 API:cocoawithlove.com/2008/10/…,但我会不推荐它,因为它是一个非常非常危险的黑客攻击。
      • 该死的好吧。好吧,我正在查看视图的边界...我想知道是否可以关闭剪辑,然后将视图的边界偏移 -10 像素,然后将视图的帧偏移 +10 像素(第二个玩家的帧)。尽管我必须记住在框架上检查 -10 像素的任何碰撞/位置信息。
      • @cclogg 您可以影响命中测试,但是一旦按钮开始接收触摸事件,它将正常处理它们。 UIView 子类的每个合理实现都使用[UITouch locationInView: self],它可以正确处理bounds 偏移甚至超层的sublayerTransform。我怀疑您只能在最简单的情况下欺骗触摸偏移算法:当您不使用任何标准控件时,例如在纯 OpenGL 游戏中。
      • 我对这个偏移量感到非常沮丧。它确实影响了我在所有手写应用程序中的手写笔精度。如果有办法在 iOS 设置中将其关闭,我会非常高兴。
      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多