3

ビュー コントローラーの遷移に動的アニメーターを使用するこの例を変更しています。私がやりたいことの 1 つは、それを iPad で動作させ、重力遷移の方向を上から下、右から左に変更することです。ビューのサイズ、適用される力、および重力の方向に基づいて、ビューの遷移時間を計算する方法があるかどうかに興味がありますか? 言い換えれば、ビューが正しい境界に達して跳ね返らなくなるまでの時間です。

この正しい期間を次から返したい:

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext

私が取り組んでいる例では、プッシュの大きさが 100 に設定されています。これは iPhone の画面では機能しますが、iPad の画面では「遅すぎます」。私が理解していることから、力は画面サイズに適用されます.iPad画面は、時間内に移動するためにより強いプッシュが必要です.

そこで、次のようにコードを修正しました。

pushBehavior.pushDirection = CGVectorMake(1,0);
pushBehavior.magnitude = 700.0;
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[toViewController.view]];
gravityBehavior.gravityDirection = CGVectorMake(-1.0, 0);

これは機能しますが、新しい移行にどれくらいの時間がかかるかわかりません。デフォルト値は 1.5 秒で動作しますが、0.7 秒に設定すると、ビューがトランジションの途中で動かなくなります。

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
    return 1.5f;
}


- (UIDynamicAnimator*)animateForTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext {
    // Get the view controllers for the transition
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];


    // Prepare the view of the toViewController
    toViewController.view.frame = CGRectOffset(fromViewController.view.frame, 1.0f*fromViewController.view.frame.size.width,0);


    // Add the view of the toViewController to the containerView
    [[transitionContext containerView] addSubview:toViewController.view];

    // Create animator
    UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:[transitionContext containerView]];

    // Add behaviors
    UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[toViewController.view]];
    gravityBehavior.gravityDirection = CGVectorMake(-1.0, 0);

    UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[toViewController.view]];


    [collisionBehavior addBoundaryWithIdentifier:@"LeftBoundary" fromPoint:CGPointMake(0,0) toPoint:CGPointMake(0.0f, fromViewController.view.frame.size.height+1)];


    UIDynamicItemBehavior *propertiesBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[toViewController.view]];
    propertiesBehavior.elasticity = 0.2;

    UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[toViewController.view] mode:UIPushBehaviorModeInstantaneous];
//    pushBehavior.angle = 0;
    pushBehavior.pushDirection = CGVectorMake(-1, 0);
    pushBehavior.magnitude = 700.0;

    [animator addBehavior:pushBehavior];
    [animator addBehavior:propertiesBehavior];
    [animator addBehavior:collisionBehavior];
    [animator addBehavior:gravityBehavior];

    return animator;
}
4

1 に答える 1

0

UIDynamicAnimator には次のデリゲート メソッドがあります: dynamicAnimatorDidPause: ビューが静的な状態に達すると、それが呼び出されます。したがって、transitionContext への参照を (弱いプロパティのように) 配置し、アニメーター デリゲートを self に設定して、completeTransition: を呼び出します。

-(void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator
{
    [self.transitionContext completeTransition:finished];
}
于 2016-11-04T21:35:13.867 に答える