プログラムでsplitviewcontrollerのマスタービューを非表示にする方法はありますか?私のアプリケーションでは、最初の画面はsplitviewcontrollerになります。次の画面に分割ビューは必要ありません。どうすればこれを達成できますか
Matt Gemmellは、「MGSplitViewController」と呼ばれる優れたカスタムsplitViewControllerを作成しました。これは非常に簡単に実装され、コメントが多く、通常のsplitViewController(ランドスケープビューでマスタービューを非表示にし、ランドスケープビューでスプリットの配置を変更し、ランタイム中にスプリットのサイズを流動的に変更できるようにします)を備えています。等)。
情報とデモ: http://mattgemmell.com/2010/08/03/mgsplitviewcontroller-updated/
ソースに直接: https://github.com/mattgemmell/MGSplitViewController/
sDK 5.0では、UISplitViewControllerDelegateの新しいメソッドを追加して、これを簡単に実行できるようにしました。次のように実装するだけで、マスタービューが表示されなくなります。
- (BOOL)splitViewController:(UISplitViewController*)svc
shouldHideViewController:(UIViewController *)vc
inOrientation:(UIInterfaceOrientation)orientation
{
return YES;
}
あなたがそれを見ることができる唯一の場所は回転です-マスタービューの一部はアニメーション中に見えます。私はそれを簡単な方法で修正しました、空の黒いビューをマスターにロードしました。
PS:これがi0707の実際のものかどうかはわかりません。しかし、これが現在同じ問題を抱えている他の人々に役立つことを願っています。
ジャックからの回答と同じですが、ライナーは1つです。 -(void)setDetailItem:(id)newDetailItem {...}に貼り付けて、マスターを閉じます。
[[UIApplication sharedApplication] sendAction: self.navigationItem.leftBarButtonItem.action
to: self.navigationItem.leftBarButtonItem.target
from: nil
forEvent: nil];
SplitViewControllerによって提供されるBarButtonItemは、マスタービューコントローラーをプログラムで非表示にするためのキーです。
このコードは危険です!しかしエレガントです:)
objective Cメッセージライブラリをインポートする
#import <objc/message.h>
次に、SplitViewControllerによって提供されるUIBarButtonItemのハンドルを取得します。
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.title = @"Master";
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
//Obtain handle to BarButtonItem
[self setMasterButtonItem:barButtonItem];
}
次に、イベントが発生すると、マスタービューコントローラの自動終了がトリガーされます。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
あなたはこれを行うことができます
objc_msgSend(self.masterButtonItem.target, self.masterButtonItem.action);
これを試して:
splitVC.modalPresentationStyle = UIModalPresentationFullScreen;
[splitVC presentModalViewController:[[splitVC viewControllers] objectAtIndex:1] animated:NO];
4.2で動作します!
これが機能するもう1つの素晴らしいトリックです。 ビデオリンク はこちらです。
上記のコードは私にとってはうまくいきませんでしたが、
CGRect selfFrame = self.splitViewController.view.frame;
それはしました。だから...これは私のために働きます...(このコードはdetailviewcontrollerにあるはずです)
-(void)hideMaster {
UIViewController *masterController = GetAppDelegate().masterController;
CGRect selfFrame = self.splitViewController.view.frame;
CGFloat aWidth = masterController.view.frame.size.width;
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
if(orientation == UIDeviceOrientationLandscapeLeft)
{
selfFrame.size.height += aWidth;
selfFrame.Origin.y -= aWidth;
}
else if(orientation == UIDeviceOrientationLandscapeRight)
{
selfFrame.size.height += aWidth;
}
[self.splitViewController.view setFrame:selfFrame];
[UIView commitAnimations];
}
ローテーションを許可するには、これが必要でした:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration]; // not sure if needed
//By the time this method is called the bounds of the view have been changed
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
if (UIInterfaceOrientationIsPortrait(interfaceOrientation)) {
if (masterIsHidden) {
[self showMaster];
}
} else {
if (self.editing) {
[self hideMaster];
}
}
[UIView setAnimationDuration:duration];
[UIView commitAnimations];
}
これがあなたが探しているものかどうかはわかりません。たとえば、ボタンがクリックされたときに横向きモードでマスタービューを非表示にするには、(selectorメソッドで)次の操作を実行できます。
UIViewController *master = [splitViewController.viewControllers objectAtIndex:0];
UIViewController *detail = [splitViewController.viewControllers objectAtIndex:1];
[master.view setFrame:CGRectMake(0, 0, 0, 0)];
detail.view.frame = splitViewController.view.bounds; // or use master and detail length
これは機能します:
たとえば、ボタンに「非表示」メソッドを追加します。
UIBarButtonItem *hideButton = [[UIBarButtonItem alloc] initWithTitle:@"hide"
style: UIBarButtonItemStylePlain
target: self
action: @selector(hide:)
];
[self.mainView.navigationItem setLeftBarButtonItem:hideButton];
このコードでは、「self.mainView」は、splitviewの2番目のビューにあるナビゲーションコントローラーのビューコントローラーです。
Hideメソッドは次のようになります。
-(void)hide:(id)sender
{
UIViewController *masterController = [self.viewControllers objectAtIndex:0];
CGRect selfFrame = self.view.frame;
CGFloat aWidth = masterController.view.frame.size.width;
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
if(orientation == UIDeviceOrientationLandscapeLeft)
{
selfFrame.size.height += aWidth;
selfFrame.Origin.y -= aWidth;
}
else if(orientation == UIDeviceOrientationLandscapeRight)
{
selfFrame.size.height += aWidth;
}
[self.view setFrame:selfFrame];
[UIView commitAnimations];
}
これが出発点です。回転を処理したり、再度表示したりするには、明らかにさらに多くのロジックを実行する必要があります。
これがお役に立てば幸いです。
IOS5およびXcode 4.3でテスト済み
ナイストランジション(申し訳ありません)はありませんが、ルートビューを詳細ビューコントローラーのビューに設定し、UISplitViewでビューを交換して詳細ビューをUISplitViewに移動することで、これを行うことができます。 (実際には、ビューの入れ替え(プッシュ/フリップなど)をアニメーション化できる場合がありますが、ビューの変更アニメーション中に何かを変更することはお勧めできません。詳細ビューをUISplitViewの内部に移動しても問題ありません。)