1

私には奇妙な状況があります。アニメーションを実行しようとしていて、完了ハンドラーを待っています。timingFunction を定義するまで、すべてが正常に機能します。その後、completedHandler がまったく呼び出されないことがあります。そして、私のアニメーションは最後のフレームで動かなくなりました。

CGFloat rotations = times * 2.0;
CGFloat zoomLevel = COIN_MOVE_UP;
SCNAction* rotate = [SCNAction rotateByX:M_PI_2 y:0 z:0 duration:2.0 / (rotations + 1)];
NSUInteger swaps = rotations / 2;
SCNAction* rotateSequence = [SCNAction repeatAction:rotate count:2];
SCNAction* coinRotate = [SCNAction repeatAction:rotateSequence count:swaps];
SCNAction* coinRotateAction = [SCNAction sequence:@[coinRotate, rotate]];

SCNAction* coinMoveUpAction = [SCNAction moveByX:0 y:-zoomLevel z:0 duration:1];
SCNAction* coinMoveDownAction = [SCNAction moveByX:0 y:zoomLevel z:0 duration:1];

SCNAction* coinMoveAction = [SCNAction sequence:@[coinMoveUpAction, coinMoveDownAction]];
SCNAction* coinRotateY = [SCNAction rotateByX:0 y:M_PI z:0 duration:2];
SCNAction* fullGroup = [SCNAction group:@[coinRotateAction, coinMoveAction, coinRotateY]];
[fullGroup setTimingFunction:^(float time){
    return time;
}];

[self.coinNode runAction:fullGroup completionHandler:^{
    // completion is not called sometimes when timingFunction is efined
}];

それを修正する方法はありますか?

PS私が実装した:

-(void)renderer:(id<SCNSceneRenderer>)renderer didApplyAnimationsAtTime:(NSTimeInterval)time{

}

タイミング関数がないと、アニメーションが終了するとこのメソッドが呼び出されなくなりますが、timig関数が存在する場合、アニメーションは最後まで実行されますが、完了ハンドラーは呼び出されず、didApplyAnimationsAtTime: がまだ呼び出されています。だから多分どういうわけか、このアニメーションは終了状態に達した後でもまだ実行されています.

4

1 に答える 1

0

最後に、使用してこの問題を修正できました

+ (SCNAction *)customActionWithDuration:(NSTimeInterval)seconds actionBlock:(void (^)(SCNNode *node, CGFloat elapsedTime))block;

そのため、すべてのタイミング関数を削除し、ブロックとして再実装しました。

CGFloat angle = M_PI_2;
void (^block)(SCNNode * _Nonnull node, CGFloat elapsedTime) = ^(SCNNode * _Nonnull node, CGFloat elapsedTime) {
    CGFloat progress = elapsedTime / duration;
    CGFloat realTime = pow(progress, 6); // here I apply timing
    node.eulerAngles = SCNVector3Make(initialVector.x + (angle * realTime), initialVector.y, initialVector.z);
    node.position = SCNVector3Make(node.position.x, cos(angle * realTime) * 5, sin(angle * realTime) * 5);
};

このようにして、呼び出されない完了ハンドラーに問題はなく、アニメーションのタイミングを調整できます:)

于 2015-11-23T13:49:26.130 に答える