73

iOS 7 用にアプリを更新していて、奇妙な問題を発見しました。で UINavigationController にラップされた UIViewController を提示していUIModalTransitionStyleFlipHorizontalます。

iOS 6 では正常に動作しますが、iOS 7 では遷移後にナビゲーション バーがバウンドします。これはステータスバーと関係がありますか? メイン ナビゲーション バーの透過性を に設定しましたNO

Info.plist で、ビュー コントローラー ベースのステータス バーの外観が NO に設定されています。

そして、最小限のデモ アプリで問題を示す GIF を次に示します。

ここに画像の説明を入力

これが私のコードです:

feedNavigationController = [[UINavigationController alloc] init];
feedNavigationController.navigationBar.translucent = NO;

SettingsViewController *settingsVC = [[SettingsViewController alloc] init];

feedNavigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[feedNavigationController setViewControllers:[NSArray arrayWithObjects:settingsVC, nil]];

[self presentViewController:feedNavigationController animated:YES completion:nil];
4

6 に答える 6

54

これは UIKit のバグのようです。次の回避策は、私の問題を解決するようです。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}

(これを、移行先のView Controllerに配置します)。

于 2013-09-19T19:41:05.513 に答える
9

これは UIKit のバグのようです。次の回避策は、私の問題を解決するようです。

presentViewController(これを移行先のView Controllerに配置します):

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}

dismissViewControllerAnimated(これを却下するView Controllerに配置します):

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}

を使用しない場合autolayout。これをView Controllerに追加して、次のことを行う必要がありますdismiss

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    [self.view setNeedsLayout];
} 
于 2014-03-07T02:12:27.300 に答える
3

私は同じ問題を抱えていて、「解決」できました(問題の実際の解決策ではありませんが、問題ないようです:))。トリックは、pushViewController/popViewControllerを使用してビュー コントローラーを表示し、UIViewアニメーションを使用してフリップを作成することです。ビュー コントローラを表示するコードの例を次に示します。

UIViewController *viewController = [[UIViewController alloc] init];
[UIView transitionWithView:self.navigationController.view 
                  duration:0.5 
                   options:UIViewAnimationOptionTransitionFlipFromLeft 
                animations:^{
                   [self.navigationController pushViewController:viewController animated:NO];
                }
                completion:nil];

閉じるには:

[UIView transitionWithView:self.navigationController.view 
                  duration:0.5 
                   options:UIViewAnimationOptionTransitionFlipFromRight 
                animations:^{
                   [self.navigationController popViewControllerAnimated:NO];
                }
                completion:nil];

プッシュされたコントローラーで を使用したくない場合は、navigationBarを呼び出すだけ[self.navigationController setNavigationBarHidden:YES animated:NO]ですviewWillAppear。このアプローチがお役に立てば幸いです。

于 2013-09-30T16:10:49.107 に答える
1

提示するビュー コントローラーと提示するビュー コントローラーの両方について、私はUITableViewController内に を持っていますUINavigationController。どちらも自動レイアウトを使用して構成されています。他の回答では、表示中のビュー コントローラーの tableView を閉じると垂直方向に 20 ポイントジャンプするという問題が解決されないことに気付きました。

このソリューションは、この問題に対処します。

提示されたView Controller(Ben Packardによって提案されたもの)では:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController.navigationBar.layer removeAllAnimations];
}

表示中のView Controller(一部はdustyによって提案されています):

- (void)viewWillLayoutSubviews{
    if (self.navigationController.presentedViewController) {
        [self.navigationController.navigationBar.layer removeAllAnimations];
        [self.tableView.layer removeAllAnimations];
    }
    [super viewWillLayoutSubviews];
}
于 2014-07-09T13:51:08.397 に答える
-2

私も同じです。実際に機能したのは、スタイルを CoverVertical に変更することで、はるかに滑らかに見えます。

于 2013-09-22T04:37:32.700 に答える