如何使用UIFocusMovementHint?

qnyhuwrf  于 2022-10-04  发布在  Swift
关注(0)|答案(1)|浏览(75)

在读取https://developer.apple.com/documentation/uikit/uifocusmovementhint时,我很难理解在什么上下文中访问UIFocusMovementHint对象以及可以读取movementDirection变量。任何人都可以在一个简单的例子中使用这个变量吗?

sdnqo3pr

sdnqo3pr1#

我用this video at 16'29''中的话尝试了很多东西,但我找不到任何真正令人满意的东西。到目前为止,我将hint.interactionTransformhint.translationview.transformview.transform3D一起使用,得到了一些结果。例如:

override func didHintFocusMovement(_ hint: UIFocusMovementHint) {
  transform = CGAffineTransform(translationX: hint.translation.dx, y: hint.translation.dy)
}

问题是,当我想要聚焦另一个元素时,焦点引擎将很难理解。被转换的项目将以某种方式保持焦点。

然而,当轴上的值太接近1时,属性hint.movementDirection似乎被用来阻止变换。我尝试使用任意值0.4(在尝试时似乎是正确的)以防止变换,但动画似乎有点滞后,焦点移动到另一个对象似乎没有得到改善。

例如在垂直轴上。

override func didHintFocusMovement(_ hint: UIFocusMovementHint) {

  guard abs(hint.movementDirection.dy) < 0.4 else {
    return // doesn't work really well
  }

  transform = CGAffineTransform(translationX: hint.translation.dx, y: hint.translation.dy)
}

此外,即使达到最大值(-1或1),该函数仍将被调用。这似乎与文档一致:

每当用户的手指在遥控器上移动时,焦点引擎就会改变焦点项。

因此,当焦点太近而无法移动到另一个对象时,我尝试将变换重置为identity。到目前为止,这是我能得到的最好的结果。

override func didHintFocusMovement(_ hint: UIFocusMovementHint) {

  guard abs(hint.movementDirection.dy) < 0.4 else {
    transform = .identity
    return
  }

  transform = CGAffineTransform(translationX: hint.translation.dx, y: hint.translation.dy)
}

尽管当缓慢移动以不将焦点移动到另一个对象时,重置为identity的变换将是抖动的。

我认为我在这里缺少的是能够告诉焦点引擎它应该移动到另一个对象并将焦点释放到当前提示的项上。或者,也许我完全错了,在这个冗长的答案中,我没有帮助任何人。

我非常希望苹果的一些样本代码来演示如何使用这一点。WWDC视频只解释了这些值代表用户的手指交互:
现在,让我们仔细看看focusMovementHint对象。移动方向是一个向量,其值范围在负1,负1和1,1之间,表示焦点在特定方向上移动的距离有多近。这个值与用户的手指在Siri遥控器的触摸面上创建的路径有关。透视、旋转和平移都是可以用来匹配twOS的本机交互提示的值。并且,交互变换将所有这三个值组合到单个3D变换中。

也许这应该足够了,但这不是给愚蠢的我的。我非常想使用该API,因为TVCardView在这里不适合我的需要。

相关问题