hittest在ios11中没有检测到隐藏在其他背后的几何图形 - swift

时间:2017-09-26 21:14:40

标签: ios swift scenekit

我无法获得hitTest(没有选项)来检测隐藏在iOS 11中其他几何体后面的几何体。我的代码在iOS 10上工作正常。任何人都知道如何修复?

实施例: let hitResults = scnView.hitTest(location,options:nil)

应返回多个节点 - 但只返回一个节点。

4 个答案:

答案 0 :(得分:3)

添加一些额外的细节 - 根据我的经验,在SceneKit处理触摸的方式上,从iOS 10到iOS 11发生了重大变化。具体来说,正如Bernd在上面指出的那样,SceneKit中的DEFAULT操作现在只在[SCNHitTestResult]中返回“ray”中触及的第一个节点。

附加评论是,如果您希望向后兼容iOS 10或之前,我似乎无法让它工作,因为上面提到的解决方案需要iOS 11部署目标。所以Apple似乎已经改变了触摸处理的默认方式,如果你希望它以原始方式工作,你必须更改[SCNHitTestOption.searchMode:1]的默认值,这仅在你更改部署目标时可用到iOS 11或更高版本。 (谢谢,Apple)

以下是我在寻找使用Xcode 9 / iOS 11更新进行iOS 10部署工作的方法时发现的一些更奇怪的事情。 (注意:在使用iOS 10.3部署目标版本测试这些场景时,我已将手机升级到iOS 11)

  1. [SCNHitTestOption.firstFoundOnly:0]虽然可用于iOS 10部署,但如果.searchMode也未设置为1(这需要iOS 11
  2. ),则似乎会被忽略
  3. 同样[SCNHitTestOption.categoryBitMask:]虽然可以在iOS 10部署中使用,但如果.searchMode也未设置为1,则似乎会被忽略...
  4. 据我所知,最重要的是Apple竭尽全力迫使开发人员升级到最新的操作系统(无论是有意还是无意中),然后“鼓励”最终用户必须升级才能获得最新的应用程序更新。

答案 1 :(得分:2)

您应该使用符号常量SCNHitTestSearchMode.all代替1,它更具描述性。

if #available(iOS 11.0, *) {
    hitResults = scnView.hitTest(location, options: [.searchMode: SCNHitTestSearchMode.all.rawValue]) }
}

其他选项为.closest.any

答案 2 :(得分:1)

我能够找到一个解决方案 - 并将在此处分享,也许对其他人有用:

Apple推出了这个新的searchMode - 默认情况下是“最接近的” - 你可以通过将searchMode设置为ALL = 1来获得旧的行为

if #available(iOS 11.0,*){      hitResults = scnView.hitTest(location,options:[SCNHitTestOption.searchMode:1]) }

答案 3 :(得分:1)

或者在Objective C中...... 选项:@ {SCNHitTestOptionSearchMode:[NSNumber numberWithInt:1]}