UITabBarController
があり、デフォルトのビューコントローラはUINavigationController
です。 UINavigationController
で特定のビューをプッシュするときに、UITabBarControllerのUITabBarを非表示にできるようにしたい。
追加してみました:
delegate.tabBarController.hidesBottomBarWhenPushed = YES;
ビューをプッシュする前のUINavigationController
にありますが、それではうまくいかないようです。
私がやるべきこと、それが可能かどうかについてのヒントはありますか?前もって感謝します!
これの方が良い:
viewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:viewController animated:YES];
ビューにプッシュするコントローラーでhidesBottomBarWhenPushed = YESを設定する必要があります...
ストーリーボードを使用する場合は、プッシュ時にタブバーを非表示にするセットアップが簡単なビューコントローラで、宛先のビューコントローラで次のチェックボックスを選択するだけです。
私は提案された解決策のほとんどを試しました。結局、それらのどれも私のために働きませんでした。
hideTabBarWhenPushedは、次にプッシュされるビューコントローラーだけでなく、内部にプッシュされるすべてのビューコントローラーのタブバーを非表示にします。それらのために私はタブバーコントローラーを再表示したかった。
Orafaelreisのソリューション(上記を参照)は、そのほとんどに適しているように見えました。しかし、彼の試みは、逆さまにさえも、厳密な肖像画の向きに対してのみ機能しました。だから私はそれを直さなければなりませんでした。これは私が最終的に得たものです:
#define kTabBarHeight 49 // This may be different on retina screens. Frankly, I have not yet tried.
- (void) hideTabBar:(BOOL)hide {
// fetch the app delegate
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
// get the device coordinates
CGRect bounds = [UIScreen mainScreen].bounds;
float width;
float height;
// Apparently the tab bar controller's view works with device coordinates
// and not with normal view/sub view coordinates
// Therefore the following statement works for all orientations.
width = bounds.size.width;
height = bounds.size.height;
if (hide) {
// The tab bar should be hidden too.
// Otherwise it may flickr up a moment upon rotation or
// upon return from detail view controllers.
[self.tabBarController.tabBar setHidden:YES];
// Hiding alone is not sufficient. Hiding alone would leave us with an unusable black
// bar on the bottom of the size of the tab bar.
// We need to enlarge the tab bar controller's view by the height of the tab bar.
// Doing so the tab bar, although hidden, appears just beneath the screen.
// As the tab bar controller's view works in device coordinations, we need to enlarge
// it by the tab bar height in the appropriate direction (height in portrait and width in landscape)
// and in reverse/upside down orientation we need to shift the area's Origin beyond zero.
switch (delegate.tabBarController.interfaceOrientation) {
case UIInterfaceOrientationPortrait:
// Easy going. Just add the space on the bottom.
[self.tabBarController.view setFrame:CGRectMake(0,0,width,height+kTabBarHeight)];
break;
case UIInterfaceOrientationPortraitUpsideDown:
// The bottom is now up! Add the appropriate space and shift the rect's Origin to y = -49
[self.tabBarController.view setFrame:CGRectMake(0,-kTabBarHeight,width,height+kTabBarHeight)];
break;
case UIInterfaceOrientationLandscapeLeft:
// Same as Portrait but add the space to the with but the height
[self.tabBarController.view setFrame:CGRectMake(0,0,width+kTabBarHeight,height)];
break;
case UIInterfaceOrientationLandscapeRight:
// Similar to Upside Down: Add the space and shift the rect. Just use x and with this time
[self.tabBarController.view setFrame:CGRectMake(0-kTabBarHeight,0,width+kTabBarHeight,height)];
break;
default:
break;
}
} else {
// reset everything to its original state.
[self.tabBarController.view setFrame:CGRectMake(0,0,width,height)];
[self.tabBarController.tabBar setHidden:NO];
}
return;
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
// It is important to call this method at all and to call it here and not in willRotateToInterfaceOrientation
// Otherwise the tab bar will re-appear.
[self hideTabBar:YES];
// You may want to re-arrange any other views according to the new orientation
// You could, of course, utilize willRotateToInterfaceOrientation instead for your subViews.
}
- (void)viewWillAppear: (BOOL)animated {
// In my app I want to hide the status bar and navigation bar too.
// You may not want to do that. If so then skip the next two lines.
self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
[self hideTabBar: YES];
// You may want to re-arrange your subviews here.
// Orientation may have changed while detail view controllers were visible.
// This method is called upon return from pushed and pulled view controllers.
return;
}
- (void)viewWillDisappear: (BOOL)animated {
// This method is called while this view controller is pulled
// or when a sub view controller is pushed and becomes visible
// Therefore the original settings for the tab bar, navigation bar and status bar need to be re-instated
[self hideTabBar:NO];
// If you did not change the appearance of the navigation and status bar in viewWillAppear,
// then you can skip the next two statements too.
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
return;
}
インラインコメントは、各ステートメントの理由を説明する必要があります。しかし、それをコーディングするより賢い方法があるかもしれません。
ステータスバーとナビゲーションバーを非表示にすることと関連して、副作用が1つあります。 1.このナビゲーションコントローラーから呼び出し元のナビゲーションコントローラーに戻ると、デバイスが1回回転するまで、または別のタブが前面に表示された後に関連するタブが再度選択されるまで、呼び出し側コントローラーのステータスバーとナビゲーションバーが重なります。 2.呼び出し元のViewControllerがテーブルビューであり、デバイスがテーブルに戻ったときに横向きモードの場合、テーブルは横向きに適切な方向で表示されますが、縦向きのようにレイアウトされます。左上隅は問題ありませんが、一部のテーブルセルとタブバーは画面の下に隠れています。右側には空き容量があります。これも、デバイスを再度回転させることで修正されます。
これらのマイナーだが厄介なバグの解決策を見つけたら、最新情報をお知らせします。
私はこれを解決する方法を見つけました、私は同じ問題に遭遇していましたが、Appleは、「The Elements」( http://developer.Apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html )
方法については、以下の関数を参照してください。これを、プッシュインしたいビューのinit関数に追加します!
-(id) init {
if(self = [super init]) {
self.hidesBottomBarWhenPushed = YES;
}
return self;
}
写真アプリがiPhoneで行うように、タブバーは自動的に非表示になります。また、戻ると、親ビューにタブバーが再び表示されます。
幸運を
これを機能させる方法は次のとおりです。
の中に Application Delegate
UITabBarController
を作成します。次に、特定のタブで必要なビューコントローラーとしてルートコントローラーを使用してUINavigationController
を作成します。次に、UINavigationController
をUITabBarController
の "viewControllers"配列に挿入します。そのようです:
ViewControllerForTab1 *tab1Controller = [[ViewControllerForTab1 alloc] initWithNibName:@"ViewControllerForTab1"];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:tab1Controller];
[tab1Controller release];
UITabBarController *tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = [NSArray arrayWithObjects: navController, nil];
[navController release];
[self.window addSubView:tabBarController.view];
この方法で、そのhidesBottomBarWhenPushed
内の任意のView Controllerで "YES
"プロパティを "UINavigationController
"に設定すると、UITabBar
が非表示になります。
お役に立てば幸いです。
これに対する私の解決策をここにしましょう:
#define FRAME_HIDDEN CGRectMake(0, 0, 768, 1073) //1073 = 1024 (screen) + 49 (UITabBar)
#define FRAME_APPEAR CGRectMake(0, 0, 768,1024)
-(void) setHidden: (BOOL) hidden{
CGRect frame = (hidden)? FRAME_HIDDEN : FRAME_APPEAR;
[self.tabBarController.view setFrame:frame];
[self.tabBarController.tabBar setHidden:hidden];
}
必要な場所で 'setHidden'メソッドを呼び出します!これと「シングルトンパターン」を使用すると、サブビューでスーパービューのUITabBarを非表示にできます
ビューを設定するとhidesBottomBarWhenPushed:YES
ビューが表示されると、バーが非表示になります(私の側ではそうです)。私はそれをUITabBarController
に割り当てていましたが、それについて考えるとあまり意味がありません。
[self.view hidesBottomBarWhenPushed:YES];
[super pushViewController:viewController animated:animated];
非表示にするコントローラーでhidesBottomBarWhenPushed
を使用します。
すべてのコントローラーを非表示にするには、prepare for segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
segue.destination.hidesBottomBarWhenPushed = true
}
最初のUIViewController「FirstItemViewController」で
@IBAction func pushToControllerAction(sender: AnyObject) {
self.hidesBottomBarWhenPushed = true
self.performSegueWithIdentifier("nextController", sender: self)
}
次のUIViewController "ExampleViewController" `
override func willMoveToParentViewController(parent: UIViewController?) {
if parent == nil {
var viewControllers = self.navigationController!.viewControllers
if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstItemViewController.self)) {
(viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false
}
}
}
この答えを見てください https://stackoverflow.com/a/36148064/3078925