28

Apple の iPhone 用公式マップ アプリには、右下隅に小さな「ページめくり」ボタンがあります。それを押すと、マップ自体が剥がれていくつかのオプションが表示されます。この効果を自分のアプリで複製したいと思います。

UIModalTransitionStylePartialCurl (SDK 3.2 で追加) を使用しようとしています。レイアウトに関しては、私のアプリは Apple の公式 Maps アプリとほとんど同じです。画面全体を簡単に剥がすことができ、その下に別のビューが表示されますが、これは望ましくありません。マップビューのみを剥がしたい。

この効果を作成するには、遷移を実行する UIViewController が必要です。この UIViewController のビューを、画面全体を占有しない画面のどこかにある小さなサブビューに設定すると、そのサブビューだけを剥がすことができます。それは素晴らしいことです!ただし、遷移の 2 番目の部分 (ページが元の位置に戻るとき) の後、ビューは決して元の位置に戻りません。はがしたビューが元の位置から移動するか、表示されたビューが拡大して画面全体を占めるようになります。

私が犯している明らかな間違いはありますか?私は本当に助けていただければ幸いです!

私が使用しているコードは非常に単純です。基本的には次のとおりです。

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;

[curlableMapViewController presentModalViewController:underMapViewController animated:YES];
4

8 に答える 8

10

ドキュメントから:

UIModalTransitionStylePartialCurl

ビュー コントローラーが表示されると、現在のビューの 1 つの角が丸まって、下にあるモーダル ビューが表示されます。閉じると、丸まったページがモーダル ビューの上に展開されます。このトランジションを使用して表示されるモーダル ビュー自体は、追加のモーダル ビューを表示できません。

このトランジション スタイルは、親ビュー コントローラーがフルスクリーン ビューを表示しており、UIModalPresentationFullScreen モーダル プレゼンテーション スタイルを使用している場合にのみサポートされます。親ビューに別のフォーム ファクターを使用しようとしたり、別のプレゼンテーション スタイルを使用しようとすると、例外がトリガーされます。

ただし、フルスクリーン以外のプレゼンテーションを使用する例外はありません。私はテストしていましたが、あなたと同じ問題が発生しました。ParentViewController のビューが ImageView で、コンテンツ モードを UIViewContentModeCenter に設定すると、ビューのサイズが変更されたり、移動されたりしないことがわかりました。おそらく、現在のビューを画像として保存し、それを一番上に置き、カールを作成し、モーダルを閉じた後、混乱した非表示のものを再配置し、一番上の画像ビューを削除することによる回避策があります。ばかげているように聞こえるかもしれませんが、本当にその要件を達成しなければならない場合は、それを試してみたいと思います。

これが役に立てば幸いです、ホルヘ。

于 2010-10-04T01:15:45.070 に答える
7

このようなものはどうですか:

    [UIView beginAnimations:@"PartialPageCurlEffect" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:myOldSubViewController.view cache:YES];

    [myOldSubViewController.view addSubview:myNewViewController.view];

    [UIView commitAnimations];

注:一部のビューでは、ビューが複雑で中心から外れている場合、アーティファクトが発生する可能性があります。に変更cache:YESするcache:NOと修正される場合があります。

于 2010-10-27T18:55:49.513 に答える
7

cprcrack が指摘しているように、これは元の質問には答えません。とはいえ、有益な情報なので残しておきます。

これは実際には、あなたが想像するよりもはるかに簡単です。

ビュー コントローラMapViewControllerとを呼び出しますSettingsViewController。あなたの問題は、表示するために一部(および一部のみ)を剥がしたいことです。MapViewControllerSettingsViewController

方法は次のとおりです。

  • 両方のビューにフル サイズのビューを使用します。
  • のビューの半分にのみコンテンツを配置します。SettingsViewController
  • UIModalTransitionStylePartialCurlあなたがすでにそうであるように、それらの間を移行するために使用します。

iOS は、これが自動的に行われたことを検出し、すべてのコンテンツがある場所である のビューのMapViewController下半分まで、 のビューのみを剥がします。SettingsViewController

のビューの上半分にコンテンツを配置すると、iOS はそれを検出し、代わりに s ビューを完全にSettingsViewController引き戻します。MapViewController

まとめ: 新しいビューの下半分だけにコンテンツを配置します。iOSはそれを理解します。

(これはどこにも文書化されていないと思います、申し訳ありません。)

于 2011-08-31T21:24:45.220 に答える
5

私は少し混乱していました

.modalTransitionStyle

.modalPresentationStyle

最初のものは TARGET viewController に置かれます。たとえば、その下にあるものです。2 番目は PARENT viewController に適用されます。たとえば、curl によって実際に歪むものです。OPはこれを正しく理解していましたが、私は間違っていました.10分間はイライラしました. 私が必要としていたヘッドスラップを他の誰かに与える場合に備えて、この投稿にそれを投げます。

于 2011-06-26T18:05:17.403 に答える
0

Apple の Maps アプリケーションは、文書化されていないトランジション (mapCurl と mapUncurl) を使用していると思います。caecus314 が望んでいることを正確に行う方法があるかどうかはわかりません (これは、私が複製しようとしている効果でもあります)。

UIModalTransitionStylePartialCurl は、ツールバーを含む最初のビューの下部全体を丸めます。これは、マップのみを丸め、ツールバーを所定の位置に残す Apple の Maps アプリとは異なります。

私が知る限り、マップを丸めるだけの方法はありません。

于 2012-07-13T22:44:50.717 に答える
0

私もこの問題を抱えていましたが、解決しました..(正しい方法はわかりませんが、機能しています)

スクロールビュー内にイメージビューが必要で、ユーザーがそのスクロールビュー内のボタンをタップすると、スクロールビューを丸めてその場所にテーブルビューを表示したいと考えていました。だから私はスクロールビューの後ろにテーブルビューを置き、最初はそれを非表示に設定しました。ユーザーがボタンをタップしたとき

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:frontView cache:YES];
[UIView commitAnimations];

その後、フロントビューをビューから削除しました。それが役立つことを願っています..

于 2010-10-25T10:14:19.553 に答える
0

私もこの問題に遭遇しました。私にとって、親ビューのフレームは、モーダル ビューが閉じられるまで壊れませんでした。そのため、閉じる前にフレームをキャッシュし、すぐに復元しました。

CGRect frame = controllerWithModal.view.frame;
[controllerWithModal dismissModalViewControllerAnimated:YES];   
controllerWithModal.view.frame = frame;
于 2010-10-21T23:06:51.273 に答える
0

viewWillDisappearあなたのメソッドを次のunderMapViewControllerようにオーバーライドします。

- (void)viewWillDisappear:(BOOL)animated
{
    curlableMapViewController.view.frame = CGRectMake(0.f, 0.f, 320.f, 416.f);

    [super viewWillDisappear:animated];
}

これにより、ビューのサイズが指定した既知のサイズに修正されます。たとえばcurlableMapViewController、メソッドの前半で保存できます。viewWillAppear

于 2012-10-04T23:16:01.073 に答える