私はクラス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
が呼び出されると、ビューのレイヤーマスクがリセットされることです。