初めての iPad アプリケーションを作成しています。私の要件の 1 つは、UISplitviewcontroller と UINavigationController を処理することです。
提案されたビュー階層は
(LoginView) -> UINavigationView(LandingView + CollectionView) -> UISplitViewcontroller( DetailsView) です。
私たちのアプリはランドスケープモードのみをサポートしています。
私はこのSO の質問(および GILT アプリも) を参照しています。
だから私の質問は
1)誰かが小さなコードスニペットまたはチュートリアルへの参照を提供できる場合、どうすれば同じことを達成できますか
2)Apples HIGに従って、UISplitviewcontrollerはrootviewcontrollerである必要があります。Apple は私のアプリを拒否しますか?(どうやら GILT グループは承認されているようです
)MGSplitViewController、root 以外で使用できますか?
どんな助けでも大歓迎です。初心者として、私の質問が本物であることを願っています
5 に答える
すぐに使用できるsplitView を使用する場合は、root である必要があります。ここでのホケアリー・ポケリーは、りんごのガイドラインに違反するか、非常に奇妙な動作を示します。
MGSplitViewControllerは、SplitViewController の完全なカスタム実装です。そのようなことが必要な場合は非常に優れていますが、一部の機能は、アプリが方向付けられるという事実に基づいています。
または、自分で作成することもできます。私はこれを複数回行ったことがありますが、思ったより簡単です。
(LoginView) -> UINavigationView(LandingView + CollectionView) -> UISplitViewcontroller( DetailsView)。
すぐに使用できる UISplitView に基づいて、次のことをお勧めします。
splitView をルート ビューにします。
アプリが起動するとすぐに全画面モーダルをポップ (アニメーション化されません) し、ユーザーがこれで loginView、LandingView、および collectView をナビゲートできるようにします。ここで navController を使用することもお勧めします。
ユーザーが splitView に進む準備ができたら、splitView の rootView Controller と DetailViewController に必要なものを入力し、Modal をアニメーション化します。
デイブにはポイントがありますが、ユーザーから方向の選択を削除しているという観点から見ていきます。標準的な選択肢 (サポートされている方向など) を削除しても、設計者は構成によっては効率が良いと想定しているため、一部のユーザーを困らせるだけです。
私は私の中にメソッドを作ることによってそれをしましたdetailViewController
:
-(void)popHomeScreen:(BOOL)animated//OPENS THE HOMESCREEN IN A MODAL DISPLAY
{
firstRun=NO;
//myViewControllerForPopOver init here
myViewControllerForPopOver.modalPresentationStyle = UIModalPresentationFullScreen;
myViewControllerForPopOver.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;//simple anime
if (animated) [self presentModalViewController:myViewControllerForPopOver animated:YES];
else [self presentModalViewController:myViewControllerForPopOver animated:NO];
}
次に、detailViewControllers
ViewDidAppear
メソッドで呼び出します。
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(firstRun)[self popHomeScreen:NO];
}
//YOU WILL ALSO NEED TO MAKE 'firstRun=YES' in viewDidLoad
//firstRun is a BOOL
ルートが消える (大きな黒いスペースが残る) ことは、既知のバグです。私はしばらくの間、アニメーションを描画する直前にアニメーションを注文したことが原因だと思っていました.
また、splitView の上にフルスクリーン モーダルをポップした場合、フルスクリーン モーダルが正しく描画されなかった直後に (たとえば) 別のフォーム ベースのモーダルをポップしたことがわかりました。
SplitView は義理の母のようなものです。あなたはあまり好きではありません。使用する必要がある場合は、地雷をつま先で回避する必要があります。
これを試してください、それは私のために働きます
1) アプリ デリゲートの didFinishLaunchingWithOptions で、ログイン ビューをルート ビューにする
self.window.rootViewController = self.loginViewController;
また、テンプレートと同じように分割ビューを初期化します (ただし、self.window には追加しません)。
MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil] autorelease];
UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
DetailViewController *detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil] autorelease];
UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
self.splitViewController = [[[UISplitViewController alloc] init] autorelease];
self.splitViewController.delegate = detailViewController;
self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController ,detailNavigationController, nil];
2) アプリのデリゲートにスワップ ビュー コントローラーを追加します。これにより、ルート ビューが分割ビュー コントローラーにスワップされます。
-(void)swapToViewControllers:(RootViewControllerType)viewType
self.window.rootViewController = self.splitViewController;
3) ログイン ビューで swapToViewControllers を呼び出します。
HIG は、すべてのオリエンテーションをサポートすることを強く推奨していることを覚えておいてください。ランドスケープのみをサポートする非常に正当な理由がない限り、おそらく拒否されるでしょう。
HIG の 19 ページを参照してください: http://developer.apple.com/library/ios/documentation/General/Conceptual/iPadHIG/iPadHIG.pdf
Ryan CY のバージョンを絵コンテで修正。
このコードをログイン コントローラーに配置します。
1. UISplitViewController のストーリーボード ID を SplitViewController に設定します。
2. UISplitViewController デリゲートを設定し、インスタンスを保存します
UISplitViewController* splitController = [self.storyboard instantiateViewControllerWithIdentifier:@"SplitViewController"];
UINavigationController* navigationController = [splitController.viewControllers lastObject];
splitController.delegate = (id)navigationController.topViewController;
3. ログイン後に rootViewController を変更する
self.view.window.rootViewController = splitController;