私がやっていること:
私のアプリでは、次のコードを使用してモーダルビューコントローラー(アプリの設定を含む)を提示しています。
optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentModalViewController:optionsViewController animated:YES];
このトランジションは、ビューの下部を丸くして、いくつかの設定を公開します。 (例については、「マップ」アプリを参照してください。)元のビューはまだ存在するがグレー表示されているページの上半分をタップすると、モーダルビューコントローラーが自動的に閉じられます(OSによって処理されました。 tのコード)。
-
機能していないもの:
これはiOS 4で正常に機能しています(実際、私のアプリは現在App Storeにあります)。しかし、iOS 5では、Appleがこの遷移の動作を変更し、View Controller自体が消えなくなりました。以前はOSで処理されていた動作を再現しようとしています。 、しかし方法を理解することはできません。
-
私が試したもの:
オプションビューの上部に非表示のボタンを追加しても機能しません。その後、ページは完全に丸くなりますが、これは望ましくありません。
これとは別に、私は立ち往生しています。これが元々どのように機能したかを複製する方法(または最初から間違った方法でやっていた!)どんな助けも大歓迎です!
おい、私は同じ問題に出くわした..そして、ここにparentViewControllerの使用について見つけたものがあります:
5.0以降、これは現在のView Controllerを返さないことに注意してください。
これはUIViewControllerのヘッダーファイルに記述されています...
私はShareKitを使用しており、modalViewControllerはiOS4で完全に機能していましたが、iOS5では、それ自体が却下されません!これは、コードで次を使用しているためです。
[[currentView parentViewController] dismissModalViewControllerAnimated:animated];
parentViewControllerはnilを返します。これはモーダル表示のView Controllerであるためです...
解決策を探すことで、あなたの質問を見つけました。だから、私は自分でそれを修正することにしました:P
前の行をこれに変更しました:
[currentView dismissModalViewControllerAnimated:YES];
魅力のように機能します。
編集:元の質問の解釈方法に応じて、2つの答えがあります。 2番目は次のとおりです。
IOS5では、モーダルコントローラーは、カールをクリックしたときにのみ終了しますが、カールや背景の上ではありません。 iOS5では、実際にモーダルビューを取得して背景またはカールをタップすると自動的に消えるために、次のコードをコントローラーに追加し、モーダルビューのタップを聞きますが、ボタンへのタップは無視します。これは、ページカールでモーダルコントローラーを操作する場合のiOSの以前のバージョンの動作を模倣する必要があります。
- (void)viewDidLoad
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;
[backgroundView addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//change it to your condition
if ([touch.view isKindOfClass:[UIButton class]]) {
return NO;
}
return YES;
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
[self dismissModalViewControllerAnimated:YES];
}
モーダルビューコントローラーを閉じるために使用しているコードは何ですか?私はこのようなコードを見てきました:
[self.parentViewController dismissModalViewControllerAnimated: YES];
oSのすべてのバージョンで機能するわけではありません。ただし、これ:
[self dismissModalViewControllerAnimated: YES];
する必要があります。
私は同じ問題を抱えていましたが、以下を使用する人にも影響します:
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
オブザーバーで修正し、却下した場所にこれを追加します:
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];
そして、これは親の親View Controllerで:
// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];
//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
[self dismissModalViewControllerAnimated:YES];
}
// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];
これは(現在の最終バージョンの)iOS 5で動作するようです。
タップする必要があるのは、ページのカールを消すための特定の領域です-画面の上部の端の近くをタップしても何もしないようですが、ページのカールのグラフィックの上の中央のぼやけた部分は常に消えますモーダルビュー。
その狭いタップ領域の動作がiOS 5の新機能なのか、それとも既に存在していたのかはわかりません。うまくいけば、それが参考になります!
IOS5では、モーダルコントローラーは、カールをクリックしたときにのみ終了しますが、カールや背景の上ではありません。 iOS5では、実際にモーダルビューを取得して背景またはカールをタップすると自動的に消えるために、次のコードをコントローラーに追加し、モーダルビューのタップを聞きますが、ボタンへのタップは無視します。これは、ページカールのあるモーダルコントローラーを使用する場合の以前のバージョンのiOSの動作を模倣する必要があります。
- (void)viewDidLoad
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;
[backgroundView addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//change it to your condition
if ([touch.view isKindOfClass:[UIButton class]]) {
return NO;
}
return YES;
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
[self dismissModalViewControllerAnimated:YES];
}
おかげで、これは私に多くの時間を節約しました。 presentModalViewController
メソッドとdismissModalViewController
メソッドがUIViewControoler.h
のソースコードに従って非推奨になったことに気付きました。代替のpresentViewController
およびdismissViewController
メソッドがあります。