シンプルなアプリで分割ビュー コントローラーを使用しています。すべてをデフォルトのままにしておくと問題なく動作します。つまり、マスター ビュー コントローラーは常に横向きで表示され、戻るボタンが押されると縦向きで詳細ビュー コントローラーをオーバーレイします。
私がやりたかったのは、マスター ビュー コントローラーが縦向きと同じ機能を横向きでも模倣できるようにすることでした。つまり、デバイスが横向きの場合、戻るボタンを押すまでマスター ビュー コントローラーを非表示にしてから、詳細ビュー コントローラーをオーバーレイする必要があります。
これを行う最善の方法は、次のコードを使用することだと考えました。
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController: (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return self.bHideMaster;
}
これは、ランドスケープモードでマスタービューコントローラーを非表示にするという点で機能しました。次に、次のコードを使用して再表示しました。
- (void)hideUnhidePagesController:(id)sender
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
UISplitViewController* spv = self.splitViewController;
// Change hide to unhide or vica versa
self.bHideMaster= !self.bHideMaster;
// Hide the button if master is visible
if(self.bHideMaster)
{
self.navigationItem.leftBarButtonItem = self.pagesBarButton;
}
else
{
self.navigationItem.leftBarButtonItem = nil;
}
[spv.view setNeedsLayout];
[spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
[[self.splitViewController.viewControllers lastObject] view].frame = self.splitViewController.view.frame;
[UIView commitAnimations];
}
これはほとんど機能しました。私には2つの問題があります:
マスター ビュー コントローラーの非表示から再表示および再表示から非表示への遷移はアニメーション化されておらず、非常に厳しいものです。アニメーション コードを追加しましたが (上記を参照)、マスター ビュー コントローラーではなく、詳細ビュー コントローラーのみをアニメーション化します。マスターは、詳細ビュー コントローラーがスライドするまで、即座に表示および非表示になります (ブラック ボックスを非表示のままにします)。
これは私の2番目の問題も示しています。マスター ビュー コントローラーがランドスケープ モードで表示されたときに、ディテール ビュー コントローラーをオーバーラップさせ、ディテール ビュー コントローラーをそのまま残します。代わりに、詳細ビュー コントローラーのサイズを変更します (開始前のランドスケープ モードと同じ方法です)。マスター ビュー コントローラーがポートレート モードと同じように対話するようにします。マスター ビュー コントローラーは、詳細コントローラーの上にスライド インし、項目が選択されるとスライドして戻ります。
問題 2 を解決できれば、問題 1 について心配する必要はありません。スプリット ビュー コントローラーには、左側からマスターをスライドさせる (詳細ビュー コントローラーをオーバーラップする) メソッドが必要なようです。ポートレートモードで実行されるため、コードがそこにある必要があります。ランドスケープモードで同じコードを呼び出すにはどうすればよいですか?
ありがとう!
----------編集1---------
hideUnhidePagesController をリファクタリングし、近づいています。ウィンドウは、縦向きと横向きの両方でオーバーレイされるようになりました。回転時にマスターが表示される場合は、まだ問題があります。混乱し、予想される動作を逆転させます。私はそれに取り組んでいます。ここで修正されたコード:
- (void)hideUnhidePagesController:(id)sender
{
// Change hide to unhide or vica versa
self.bMasterIsHidden= !self.bMasterIsHidden;
NSArray *controllers = self.splitViewController.viewControllers;
UIViewController *rootViewController = [controllers objectAtIndex:0];
UIView *rootView = rootViewController.view;
CGRect rootFrame = rootView.frame;
if(self.bMasterIsHidden)
{
rootFrame.origin.x -= rootFrame.size.width;
}
else
{
rootFrame.origin.x += rootFrame.size.width;
}
[UIView beginAnimations:@"hideUnhideView" context:NULL];
rootView.frame = rootFrame;
[UIView commitAnimations];
}