2013-09-21 6 views
16

私の目標は、アプリケーションを起動するときにスプリングボードアイコンと同様のビューからユーザーのズームモーダルトランジションを拡大することです。カスタムトランジションでcompleteTransitionを呼び出した後にナビゲーションバーが調整される

提示されたビューコントローラが正しくズームインしますが、ナビゲーションバーのステータスバーの位置が正しくありません。この位置は[transitionContext completeTransition:finished];を呼び出した後に修正されます。移行の初めからどのように修正することができますか?

これはバグのスクリーンの録音です:http://youtu.be/7LKU4lzb-uw(グリッチは、記録の第6秒である)

UIViewControllerAnimatedTransitioningコード:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIView *container = [transitionContext containerView]; 

    CGPoint viewCenter = self.view.center; 
    CGSize viewSize = self.view.frame.size; 
    CGSize controllerSize = toViewController.view.frame.size; 

    CGFloat controllerFromX = viewCenter.x - (controllerSize.width/2); 
    CGFloat controllerFromY = viewCenter.y - (controllerSize.height/2); 

    CGAffineTransform transform = CGAffineTransformMakeTranslation(controllerFromX, controllerFromY); 
    transform = CGAffineTransformScale(transform, viewSize.width/controllerSize.width, viewSize.height/controllerSize.height); 

    if (self.reverse) { 
     [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
    } else { 
     toViewController.view.transform = transform; 
     [container addSubview:toViewController.view]; 
    } 

    [UIView animateKeyframesWithDuration:ZoomTransitioningDuration 
            delay:0 
           options:0 
           animations:^{ 
       if (self.reverse) { 
        fromViewController.view.alpha = 0.0f; 
        fromViewController.view.transform = transform; 
       } else { 
        toViewController.view.transform = CGAffineTransformIdentity; 
       } 
     } 
           completion:^(BOOL finished) { 
       [transitionContext completeTransition:finished]; 
     }]; 
} 
+0

対応するビューのy原点を調整できませんか? –

+0

これを行うと、ステータスバーの下の領域は黒ではなく緑色になります(コントローラー全体が下に移動します)。 –

+0

self.viewはどこから来たのですか?プレゼンテーションビューコントローラはアニメーションコントローラですか? – bilobatum

答えて

25

問題は、あなたが容器に先のView Controllerのビューを挿入する前を変換を設定しているということです。順序を切り替える

はそれを修正する必要があります

if (self.reverse) { 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
} else { 
    [container addSubview:toViewController.view]; 
    toViewController.view.transform = transform; 
} 

はポイント4 hereを参照してください。ナビゲーションコントローラのビューをサブビューとして挿入する前にトランスフォームを適用したため、レイアウトエンジンはナビゲーションバーがウィンドウの上端にあるとは考えていないため、ステータスを避けるために調整する必要はありませんバー。

+0

それは私のために働いた!ありがとう! – Bivis

+0

私のために働いた!ありがとう! – Georg

+0

解決策を見つけようと半日を過ごした - 完璧に動作します! – Vytis

6

私はかなりものの、解決策を見つけましたハッキー。私は、手動でアニメーションを開始する前に、ナビゲーションバーのフレームを調整する必要があります。

if (self.reverse) { 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
} else { 
    toViewController.view.transform = transform; 
    [container addSubview:toViewController.view]; 

    // fix navigation bar position to prevent jump when completeTransition: is called 
    if ([toViewController isKindOfClass:[UINavigationController class]]) { 
     UINavigationController* navigationController = (UINavigationController*) toViewController; 
     UINavigationBar* bar = navigationController.navigationBar; 
     CGRect frame = bar.frame; 
     bar.frame = CGRectMake(frame.origin.x, frame.origin.y + 20.0f, frame.size.width, frame.size.height); 
    } 
} 
+2

この問題は、初めて問題を解決するだけであるということです。同じビューコントローラを後で再び表示すると、ナビゲーションバーが20ピクセル以下になる可能性があります。 – roperklacks

+0

それはうまく動作しますが、カラーのナビゲーションバーでは機能しません。 – yershuachu

+1

bar.frame = CGRectMake(frame.origin.x、frame.origin.y、frame.size.width、frame.size.height + 20.0f);はるかに良い;) – yershuachu

0

これはまだオンドレイMirtesに基づいてハック、一つですが、あなたは、コールステータスバーがあり、iOS8

if([toViewController isKindOfClass:[UINavigationController class]]) { 
    UINavigationController *navCtrl = (UINavigationController *)toViewController; 
    UINavigationBar *navBar = navCtrl.navigationBar; 
    if(navBar.frame.origin.y == 0 && navBar.frame.size.height == 44) { 
    navBar.frame = CGRectMake(0, 0, navBar.frame.size.width, fmin(44 + [UIApplication sharedApplication].statusBarFrame.size.height, 64)); 
    } 
} 

にしている場合、それは良い作品けれども醜い遺跡:/

1

まず、toViewControllerViewをContainerViewに追加し、次に示すようにtoViewControllerViewトランスフォームを設定します。

[container addSubview:toViewController.view];

toViewController.view.transform = transform;

これで問題は解決します。

関連する問題