1

私は rootViewController を持っていてUITabBarController、アクションに基づいて、正常に動作presentViewControllerする tabBarController を呼び出します。提示されるコントローラは UINavigationController です

を使用して、現在提示されている UINavigationController から別の UINavigationController に移行したいというアクションに基づいていtransitionFromViewController:toViewController:duration:options:animations:completion:ますが、エラーがスローされます。

Parent view controller is using legacy containment in call to -[UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]

UINavigationController で呼び出すときにこれを取得することについて人々は話しますが、これは UITabBarController のためのものであり、私はそれが異なることを願っています。

最終的には、現在提示されている UINavigationController から、クロス ディゾルブを使用して新しい UINavigationController に移行したいと考えています。最初のものを却下して 2 番目のものを提示できますが、そのスライドは下からのものです。これは可能ですか?

4

1 に答える 1

1

トランジションが思い通りにいかないとき、私にとって常に有効なテクニックは、単純に煙と鏡を使用することです。これは、理解してツールベルトに入れるのに一般的に優れたテクニックです。

これが私のレシピです:

A)現在の画面のスクリーンショットを撮ります:(UIViewのスクリーンショットを撮るにはどうすればよいですか?から借用)

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
CGRect rect = [keyWindow bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];   
UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

B) スクリーンショットで UIImageView を作成し、それを新しい viewController に追加します

UIImageView *fakeScreen = [UIImageView alloc] initWithImage:captureScreen];
 //accessing .view isn't best practice, consider using a dedicated property inside your UIViewController subclass, here just for the sake of explanation
[secondViewController.view addSubview:fakeScreen];

C)現在のView Controllerを無視し、アニメーション化しないようにします。あなたの場合、 UINavigationController [navigationController rejectViewControllerAnimated:NO completion:nil];

D)新しいView Controllerを提示します。アニメーション化もしないでください。(secondViewController) そして、imageView をフェードアウトします。

[self.tabBarController presentViewController:secondViewController animated:NO completion:NO];
    [UIView animateWithDuration:0.08 animations:^{
        fakeScreen.alpha = 0;
    } completion:
         ^{[
       fakeScreen removeFromSuperview]; ];

これにより、通常のフェードが得られます。実際のクロスフェードを実行したい場合は、2 番目の viewController のコンテンツを少し工夫する必要があります。2 つの子を持つルート ビューが必要です。フェードアウトします)。

于 2013-09-09T06:39:57.327 に答える