UIMotionEffect 的视差效果不起作用

Parallax effect with UIMotionEffect not working

我的 UIView 视差效果根本不起作用。我需要类似 iPhone 倾斜(伪 3D)的移动背景图像。

let horizontalMotionEffect = UIInterpolatingMotionEffect(keyPath: "center.x", type: .TiltAlongHorizontalAxis)
horizontalMotionEffect.minimumRelativeValue = -50
horizontalMotionEffect.maximumRelativeValue = 50

let verticalMotionEffect = UIInterpolatingMotionEffect(keyPath: "center.y", type: .TiltAlongVerticalAxis)
verticalMotionEffect.minimumRelativeValue = -50
verticalMotionEffect.maximumRelativeValue = 50

let motionEffectGroup = UIMotionEffectGroup()
motionEffectGroup.motionEffects = [horizontalMotionEffect, verticalMotionEffect]

imageView.addMotionEffect(motionEffectGroup)

我试过使用此代码。我读过 https://www.hackingwithswift.com/example-code/uikit/how-to-create-a-parallax-effect-in-uikit 但我的 imageView 保持不变。

我正在使用 Xcode 11,iOS 13。

在您分享的代码中,我注意到的一件事是您在枚举 .TiltAlongHorizontalAxis.TiltAlongVerticalAxis 中使用大写字母 T,它们无法编译(至少在 Xcode 11.4.1) -> 那些需要更改为小写 T

Apple 对这些枚举的文档是 here

除此之外,我没有发现您共享的代码有任何问题。事实上,我在视图中创建了一个简单的 imageView 示例项目,我向其中添加了约束,以便它填满其父视图的整个 space。

然后我添加了您共享的运动效果代码,并 运行 它在实际设备上 (iPad Pro)。效果很好。

您能否检查一些可能是问题根源的事情:

  • 仔细检查 Settings > Accessibility > Motion > Reduce Motion 是否未打开。因为如果开启了,那么UIInterpolatingMotionEffect就不行了。
  • 测试您正在测试的设备的加速度计是否正常工作。或者更好的是,使用另一台设备对其进行测试。 (这在模拟器上不起作用)。
  • 如果您在任何地方(或特别是在 viewWillLayout / viewDidLayout 中)的代码中编辑 imageView 的框架,您不应该这样做。

无论如何,如果 none 这些东西可以帮助您解决问题,您可以创建一个简单的示例项目来演示错误并 post 它在 Github 上吗?如果我真的能重现问题,我可以尝试提供帮助。