1

私の iPhone アプリでは、静的なナビゲーション バーが 1 つあるという暗示を試みているので、ビューを切り替えるときにタイトルとボタンがスワイプされません。

私はそれを行う方法を考えられないので(少なくとも)、何か提案はありますか?ナビゲーション バー スペースに静的なタイトルとボタンを配置する必要があります (UINavigationBar を使用しない場合でも、カスタムを作成します)。これにより、ビュー コントローラーをプッシュするなどの操作を行ったときに、ナビをスワイプしたときにバーは移動せず、ボタンは新しいビューの機能を変更します。

編集

わかりました、私は可能な方法を考えました。私の各ビューには、ナビゲーション バー オブジェクトを除いて、ビューの内容が含まれるセカンダリ ビューがあります。pop メソッドと push メソッドをオーバーライドして、このサブビューを画面のオンとオフでアニメーション化することはできますか?

4

3 に答える 3

3

通常どおりプッシュを実行しますが、アニメートしないように設定します。

すなわち

[self.navigationController pushViewController:newViewController animated:NO];

その後、戻りたいときは...

[self.navigationController popViewControllerAnimated:NO];

次に、2つのナビゲーションバーを作成できますが、アニメーション化されていないのと同じバーのように見えます。

ビューでアニメーション化してナビゲーションバーを維持するように編集します

アプリの全体的な流れはわかりませんが、ナビゲーションバーを維持して新しいUIをスワイプしたい場合は、スクロールビュー(ページングあり)を作成して、各VCのビューをの異なるフレームに配置できます。スクロールビューか何か。

とにかくナビゲーションバーを動かさないようにしたいのはなぜですか?ナビゲーションバーをアニメーション化し、同じボタンなどを維持することに問題はありません。

そうは言っても、異なるVCを使用している場合は、ナビゲーションバーを変更して、現在表示しているVCの詳細(つまりタイトル)を表示する必要があります。

もう1つの根本的なアプローチ

OK、今横方向に考えています:D

アニメーション化されていないプッシュアンドポップ(上記のように)を使用しますが、UIを表示するだけでなく、関連する側からアニメーション化することもできます。(シングルトンまたはVCサブクラスをUIのサブクラスにすると、すべてのビューコントローラーでこれを実行できます)。

次の問題は、新しいUIでアニメーション化する前に、UIがすぐに空白になっているように見えるため、古いUIをアニメーション化する必要があることです。つまり、両方のUI(古いものと新しいもの)を同時に画面に表示する必要があります。

これを回避するには、古いUIのビュー全体を画像に変換し(リンクを見つけるのは難しくありません)、この画像を新しいVCに渡します。新しいVCは、この画像を即座に表示し、独自のUIを画面上でアニメーション化すると同時に、画面外でアニメーション化します。

思ったほど難しいことではありません。特に、UIViewController adをサブクラス化する場合は、関数animateUIとプロパティoldUIImage、およびを指定しdirectionます。次に、このクラスのviewWillAppearをオーバーライドして、アニメーションを実行できます。次に、あなたがしなければならない唯一のことは、あなたがそれにプッシュ/ポップするとき、各VCに画像と方向を与えることです。

これは、あなたが何を求めているのかという幻想を与えるだけであり、アプリのかなり単純なオブジェクトモデルとフローを維持できることを意味します。

...か何か。

于 2013-01-05T00:40:20.357 に答える
2

@Fogmeister の良いアイデアのリフです...

提示側のビュー コントローラーで、こちらの提案を実装して、 self.view のイメージを取得します。では、発表の時は…

UIImage *image = [self makeImage];  // what it was called in the other post, consider a better name
MyViewController *newVC = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
newVC.presentationImage = image;
[self.navigationController pushViewController:newVC animated:NO];

MyViewController で、presentationImage という名前の UIImage プロパティを指定してから ...

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:self.presentationImage];
    imageView.frame = self.view.bounds;
    imageView.tag = 128;
    [self.view addSubview:imageView];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIImageView *imageView = (UIImageView *)[self.view viewWithTag:128];
    [UIView animateWithDuration:0.5 animations:^{
        imageView.frame = CGRectOffset(imageView.frame, -self.frame.size.width, 0); 
    }];
}

参考までに、これをテストしたりコンパイルしたりしませんでした。アイデアが気に入って、指を伸ばすことにしました。

于 2013-01-05T02:00:30.060 に答える
0

これを「クリーンな」方法で行うには、UINavigationController を放棄し、新しいビュー コントローラーをプッシュするときに新しいナビゲーション項目をナビゲーション バーにプッシュしないカスタム コンテナー コントローラーを作成する必要があります (または、ナビゲーション項目をビューコントローラービューのプッシュをアニメーション化しながら、アニメーション化されていない方法)。

ただし、これを行うには時間がかかります。これを行うことにした場合は、UIViewController コンテインメントで WWDC セッションをお勧めします。

私の頭に浮かんだ別の代替手段は、(サブクラス化またはメソッドの入れ替えによって) UINavigationController の動作を変更して、viewcontroller-push をアニメーション化しながら、アニメーション化されていないナビゲーション項目をプッシュすることです。

私はこれをテストしたことはありませんが、次のようなサブクラスでプッシュ (およびポップ) をオーバーライドするとうまくいく可能性があります。

- (void)pushViewController:(UIViewController *)vc animated:(BOOL)animated {
    [super pushViewController:vc animated:animated];
    [self.navigationBar setItems:self.navigationBar.items animated:NO];
}

このメソッドが機能しない場合は、pushViewController:animated: への呼び出しの直後にナビゲーション バー内でどのようなアニメーションが発生しているかを調べる価値があるかもしれません。いくつかのアニメーションをキャンセルして、最終状態に直接進むことができるかもしれません。

于 2013-01-05T01:32:12.147 に答える