这个问题是由于坐标系差异导致的。Spine 默认使用 Y 轴向上的坐标系统,而 iOS/UIKit 使用 Y 轴向下的坐标系统。
解决方案
在初始化 SpineController 时,在 onInitialized 回调中翻转 Y 轴:
_spineController = [[SpineController alloc] initOnInitialized:^(SpineController * _Nonnull ctrl) {
// 翻转 Y 轴以适配 iOS 坐标系
[ctrl.skeleton setScaleY:-1];
[ctrl.animationState setAnimationByNameWithTrackIndex:0
animationName:self.animationName
loop:YES];
} onBeforeUpdateWorldTransforms:nil
onAfterUpdateWorldTransforms:nil
onBeforePaint:nil
onAfterPaint:nil
disposeDrawableOnDeInit:YES];
说明
通过设置 skeleton.scaleY = -1 来垂直翻转骨骼,这样可以将 Spine 的 Y 轴向上坐标系转换为 iOS 的 Y 轴向下坐标系。
如果需要水平翻转,可以使用:
[ctrl.skeleton setScaleX:-1]; // 水平翻转
或者同时设置两个轴:
[ctrl.skeleton setScale:-1 y:1]; // 仅水平翻转
[ctrl.skeleton setScale:1 y:-1]; // 仅垂直翻转
注意: 缩放变化会在调用 updateWorldTransform 后反映到骨骼的世界变换中。