2016-06-22 6 views
1

私はクラスBubbleAnimatorを実装しました。これはビュー間のバブルのような移行を作成し、UIViewControllerTransitioningDelegateプロトコル経由で追加する必要があります。プレゼンテーションアニメーションはこれまでのところうまく動作します(このため、この部分のコードはすべて追加していません)。UIViewカスタムトランジションが完了時にスナップバック

しかし、ビューを閉じると、 'fromViewController' がアニメーションの最後に点滅してになります。この非常に短いフラッシュの後に、正しいtoViewControllerが再び表示されますが、このグリッチは非常に面倒です。 次が関連animateTransition -methodです:

//Get all the necessary views from the context 
    let containerView = transitionContext.containerView() 
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) 
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 

    //Presenting 
    if self.reverse == false { 

     //Add the destinationvc as subview 
     containerView!.addSubview(fromViewController!.view) 
     containerView!.addSubview(toViewController!.view) 

     /*...Animating the layer goes here... */ 

    //Dismissing 
    } else { 
     containerView!.addSubview(toViewController!.view) 
     containerView!.addSubview(fromViewController!.view) 

     //Init the paths 
     let circleMaskPathInitial = UIBezierPath(ovalInRect: self.originFrame) 
     let extremePoint = CGPoint(x: originFrame.origin.x , y: originFrame.origin.y - CGRectGetHeight(toViewController!.view.bounds)) 
     let radius = sqrt((extremePoint.x*extremePoint.x) + (extremePoint.y*extremePoint.y)) 
     let circleMaskPathFinal = UIBezierPath(ovalInRect: CGRectInset(originFrame, -radius, -radius)) 

     //Create a layer 
     let maskLayer = CAShapeLayer() 
     maskLayer.path = circleMaskPathFinal.CGPath 
     fromViewController!.view.layer.mask = maskLayer 


     //Create and add the animation 
     let animation = CABasicAnimation(keyPath: "path") 
     animation.toValue = circleMaskPathInitial.CGPath 
     animation.fromValue = circleMaskPathFinal.CGPath 
     animation.duration = self.transitionDuration(transitionContext) 
     animation.delegate = self 
     maskLayer.addAnimation(animation, forKey: "path") 
    } 

クリーンアップは、デリゲートメソッドで行われます:

override public func animationDidStop(anim: CAAnimation, finished flag: Bool) { 
    self.transitionContext?.completeTransition(!(self.transitionContext?.transitionWasCancelled())!) 
} 

私は推測する、私はcontainerViewにビューを追加すると間違って何かをやっていることを、私はそれを理解できませんでした。もう1つの可能性は、関数completeTransitionが呼び出されると、ビューのレイヤーマスクがリセットされることです。

答えて

2

this blogpostのおかげで、私はついにこの問題を解決することができました。短い説明:

CAAnimationはビューのプレゼンテーションレイヤーのみを操作しますが、モデルレイヤーは変更しません。アニメーションが終了すると、その値はモデルレイヤーの元の値と変更されていない値にスナップバックします。

ショート及び単に対応策:

 animation.fillMode = kCAFillModeForwards 
     animation.removedOnCompletion = false 

優れたソリューション、それが除去されるからアニメーションを妨げないように、手動でアニメーションを開始する前の層の位置の最終的な値を設定することです。このようにして、モデルレイヤに正しい値が割り当てられます。

 maskLayer.path = circleMaskPathInitial.CGPath 
     //Create and add the animation below.. 
関連する問題