我的应用程序使用 CMMotionManager 来跟踪设备运动,但 iOS 始终以标准设备方向(底部的主页按钮)返回设备运动数据。
为了使运动数据与 UIView 的方向相同,我将视图变换从视图向下累积到窗口,如下所示:
CGAffineTransform transform = self.view.transform;
for (UIView *superview = self.view.superview; superview; superview = superview.superview) {
CGAffineTransform superviewTransform = superview.transform;
transform = CGAffineTransformConcat(transform, superviewTransform);
}
此变换在 iOS 6 和 7 下可以正确计算,但 iOS 8 更改了旋转模型,现在无论设备的方向如何,视图始终返回恒等变换(无旋转)。不过,来自运动管理器的数据仍然固定在标准方向。
监视 UIDevice 旋转通知并手动计算四个变换似乎是在 iOS 8 下获得此变换的一种方法,但它也似乎很糟糕,因为设备方向不一定与我的视图方向匹配(即,iPhone 上的上侧是设备方向而不是通常支持)。
在 iOS 8 下将 CMMotionManager 的输出转换为特定 UIView 的方向的最佳方法是什么?
虽然不是很明显,但在 iOS 8 及更高版本中推荐的方法是使用过渡协调器。
In viewWillTransition(to:with:)
,协调员可以向您传递一个采用UIViewControllerTransitionCoordinatorContext
在您调用的任何方法的完成块中(UIKit 使用的默认协调器实际上是它自己的上下文,但情况不一定如此)。
上下文的targetTransform
属性是动画结束时应用于界面的旋转。注意这是一个relative变换,而不是结果absolute界面的变换。
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
let animation: (UIViewControllerTransitionCoordinatorContext) -> Void = { context in
// Update animatable properties.
}
coordinator.animate(alongsideTransition: animation) { context in
// Store or use the transform.
self.mostRecentTransform = context.targetTransform
}
}
虽然旧方法仍然有效,但当您需要协调动画过渡时(例如使用图形框架或使用自定义布局时),此 API 更加灵活。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)