5

私はiOSのゲームを作ってるんだと私はこの効果を達成したい: pause popup 2 different controllersiOSで別のViewControllerでポップアップ/ダイアログビューを作成するにはどうすればいいですか?

私は1つのビューコントローラを使用してそれを行う方法を知っているが、私のビューコントローラクラスは、既にコードを肥大化され、その画面のストーリーボードがあります混乱(私は実際には、上記の画像がもっと多くのビューを持っている、私は分かりやすくするためにそれらを隠した)。

これは私の質問です:このポーズのポップオーバーを管理する別のビューコントローラを使用してこれを達成する方法はありますか?私は前に提示された画面を却下しないセグを必要とします。私はストーリーボードを使ってそれをしたい。私は "popover" segueを試しましたが、私は欲しくない奇妙な境界線で現れました。

また、ポーズビューコントローラで管理されていないすべてのコントロールがイベントの受信を停止する必要があります。ポーズビューのBGとして画面全体を覆う黒の透明なビューを使用し、イベントを無視させることを考えました。より良いアプローチがありますか?

ありがとうございます。

答えて

16

あなたはストーリーボードを使用して、それを実現したい場合は、それは非常に簡単です。

私はexample code

1を添付 - ストーリーボードにカスタムPauseViewControllerを作成します。 Alpha 0のフルスクリーン表示、黒色、一時停止コントロールを含むサブビューを使用します。対応する.hと.mファイルを作成する

2 - コントロール(UIButtons)を追加してリンクします。このような解消メソッドを追加してください。 このメソッドは、階層からビューを削除し、表示解除しても表示されないようにします。

- (IBAction)dismiss:(id)sender { 
    [UIView animateWithDuration:0.3f animations:^{ 
     self.view.alpha = 0.0f; 
    } completion:^(BOOL finished) { 
     [self.view removeFromSuperview]; 
     [self removeFromParentViewController]; 
    }]; 
} 

3 - サブクラスUIStoryboardSegue独自のsegueクラスを作成します。 次に、performメソッドを次のようにオーバーライドします。これは、2つのコントローラ(送信元と送信先)を取り、送信先ビューをアニメーションとともにソースビューに配置するだけです。

-(void)perform{ 
    UIViewController *dst = [self destinationViewController]; 
    UIViewController *src = [self sourceViewController]; 

    // add the view to the hierarchy and bring to front 
    [src addChildViewController:dst]; 
    [src.view addSubview:dst.view]; 
    [src.view bringSubviewToFront:dst.view]; 

    // set the view frame 
    CGRect frame; 
    frame.size.height = src.view.frame.size.height; 
    frame.size.width = src.view.frame.size.width; 
    frame.origin.x = src.view.bounds.origin.x; 
    frame.origin.y = src.view.bounds.origin.y; 
    dst.view.frame = frame; 

    [UIView animateWithDuration:0.3f animations:^{ 
     dst.view.alpha = 0.5f; 
    }]; 
} 

4 - あなたのsegueをリンクし、カスタムを選択し、カスタムsegueクラス名を挿入します。

Ta-daaaa!

その他の詳細が必要な場合は、サンプルコードを確認するかコメントを追加してください。

+0

これはコンテナコントローラの作成によく似ています。 iosがコンテナコントローラを提供したときにこれを行う必要はありません。以下の私の答えを参照してください –

+0

彼は特別なカスタムソリューションを求めました。これはクリーンで再利用可能です。彼は任意のviewController(必要に応じて)からsegueをトリガーすることができます。あるいは、他のVCを表示するためにカスタムセグを再利用することもできます。コントローラコードからアニメーション部分(セグエートランジション)を分離します。分離は、より清潔で保守可能なコードの鍵です。 – LombaX

+0

もっと明確にするために、彼は元のシーンに埋め込まれていないものを求め、より複雑にすることを避けました。そこで、彼は可能な解決策に制限を設けました。さもなければ、より簡単な解決策はサブビュー(vc全体ではない)だけを追加し、必要に応じて表示/非表示にすることでした。 – LombaX

2

childViewControllerを調べる必要があります。このようなことをしたいと思うようです。

PauseMenuViewController *pauseMenuVC = [[PauseMenuViewController alloc] init]; 
[self addChildViewController:pauseMenuVC]; 
if ([self isViewLoaded]){ 
    [self.view addSubview:pauseMenuVC.view]; 
} 

メニューに独自のアニメーションを作成して、ビューに入り、背景を暗くする必要があります。

Apple Docs

0

あなたがココス2dのシーンを使用していないと仮定します。シンプルなiOSでは、コンテナコントローラのを使用しています。

あなたのストーリーボードに
  1. 移動し、コンテナのサイズを設定し、あなたのメインビューコントローラ(あなたがUIlabelをドラッグするだけのような)
  2. にコンテナコントローラをドラッグします。別の埋め込みビューが、同じサイズのコンテナコントローラからポップします。このView Controllerに新しいクラス名を与えます。
  3. コンテナのコンセントを作成し、必要に応じてコンテナを表示/非表示にします。

これができない場合は、このサイトでチュートリアルを行います。あなたが私にそれをして欲しいのであれば、以下にコメントしてください。

+0

私は単純なprojに取り組んでいます、私はコンテナコントローラを作成し、その中にhtml5ページをロードしたいので、あなたはそれを手伝ってもらえますか、私はhtml5でいくつかのexpを持っていますが、簡単な例やチュートリアルで手伝ってください。 – dreamweiver

0

UIStoryboardSegueサブクラスに関連する回答のバリエーションとして、透明な1x1 "blank.png"イメージを使用することもできます。そうすれば、ポップアップのView Controllerのサブビューのアルファに心配するだけで済むので、必要に応じて中央のポップアップが完全な可視性を持つようにすることができます。

-(void)perform 
    { 
     UIViewController *dst = [self destinationViewController]; 
     UIViewController *src = [self sourceViewController]; 

     // add the view to the hierarchy and bring to front 
     [src addChildViewController:dst]; 
     [src.view addSubview:dst.view]; 
     [src.view bringSubviewToFront:dst.view]; 

     // set the view frame 
     CGRect frame; 
     frame.size.height = src.view.frame.size.height; 
     frame.size.width = src.view.frame.size.width; 
     frame.origin.x = src.view.bounds.origin.x; 
     frame.origin.y = src.view.bounds.origin.y; 
     dst.view.frame = frame; 
     dst.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"blank.png"]]; 

     [UIView animateWithDuration:0.3f animations:^{ 
      dst.view.alpha = 1; 
     }]; 
    } 
関連する問題