隐藏标签栏并删除 space
Hiding the tabbar and removing the space
有没有办法隐藏标签栏并删除 space 左边(大约 50px)?
我试过了
self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true
运气不好。我看到空白 space。
this question 上的第三个答案对我来说适用于以下方式:
我的视图控制器上的代码
@IBAction func buttonPressed(sender: AnyObject) {
setTabBarVisible(!tabBarIsVisible(), animated: true)
}
func setTabBarVisible(visible: Bool, animated: Bool) {
// hide tab bar
let frame = self.tabBarController?.tabBar.frame
let height = frame?.size.height
var offsetY = (visible ? -height! : height)
print ("offsetY = \(offsetY)")
// zero duration means no animation
let duration:NSTimeInterval = (animated ? 0.3 : 0.0)
// animate tabBar
if frame != nil {
UIView.animateWithDuration(duration) {
self.tabBarController?.tabBar.frame = CGRectOffset(frame!, 0, offsetY!)
self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY!)
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
return
}
}
}
func tabBarIsVisible() -> Bool {
return self.tabBarController?.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height
}
在情节提要中:
视图控制器主视图背景颜色为黑色:
然后你可以在里面有另一个视图(背景颜色为白色),约束尾部和前导 space 到超级视图,顶部和底部 space 到布局指南。
结果是:
在评论看到你的截图后。我想你可以尝试将 hidesBottomBarWhenPushed
设置为 true.
hidesBottomBarWhenPushed = true
或故事板。
当你推送到另一个视图控制器时它会自动隐藏底部栏,当你返回时它会再次出现。
是的。当您按下查看控制器时,您可以隐藏标签栏。您可以在家中显示标签栏。当你推送到下一个视图控制器时,你可以隐藏你的标签栏。
请参阅下图在推送时隐藏按钮栏,并在所有不需要标签栏的视图控制器中进行设置。
希望对您有所帮助..
如果您仍然在隐藏的标签栏下看到黑色条纹,您是否尝试过 select 在不透明栏下延伸边缘?
还要确保 Under Bottom Bars 仍然是 selected。希望对您有所帮助!
我的首选方法是使用包装控制器。如果我想隐藏标签栏,我只需增加标签栏控制器的高度,从而有效地将标签栏移出屏幕。
使用此解决方案,您无需修改标签栏框架,也无需依赖导航控制器推送动画:
import UIKit
class ViewController: UIViewController {
let tabController: UITabBarController = {
let tabController = UITabBarController()
// setup your tabbar controller here
return tabController;
}()
var tabbarHidden = false {
didSet {
var frame = self.view.bounds;
if (tabbarHidden) {
frame.size.height += self.tabController.tabBar.bounds.size.height;
}
self.tabController.view.frame = frame;
}
}
override func viewDidLoad() {
super.viewDidLoad()
// add the tab controller as child controller
addChildViewController(self.tabController)
self.tabController.view.frame = self.view.bounds
self.tabController.view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
self.view.addSubview(self.tabController.view)
self.tabController.didMoveToParentViewController(self)
// for debugging
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(switchTabbar))
self.tabController.view.addGestureRecognizer(tapRecognizer)
}
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.tabController
}
override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.tabController
}
func switchTabbar() {
UIView.animateWithDuration(0.3) {
self.tabbarHidden = !self.tabbarHidden
}
}
}
Swift 3:
extension UITabBarController {
func setTabBarVisible(visible:Bool, duration: TimeInterval, animated:Bool) {
if (tabBarIsVisible() == visible) { return }
let frame = self.tabBar.frame
let height = frame.size.height
let offsetY = (visible ? -height : height)
// animation
UIViewPropertyAnimator(duration: duration, curve: .linear) {
self.tabBar.frame.offsetBy(dx:0, dy:offsetY)
self.view.frame = CGRect(x:0,y:0,width: self.view.frame.width, height: self.view.frame.height + offsetY)
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
}.startAnimation()
}
func tabBarIsVisible() ->Bool {
return self.tabBar.frame.origin.y < UIScreen.main.bounds.height
}
}
要使用(例如 self
是 UITabBarController
):
self.setTabBarVisible(visible: false, duration: 0.3, animated: true)
Swift 2.x:
extension UITabBarController {
func setTabBarVisible(visible:Bool, duration: NSTimeInterval, animated:Bool) {
if (tabBarIsVisible() == visible) { return }
let frame = self.tabBar.frame
let height = frame.size.height
let offsetY = (visible ? -height : height)
// animation
UIView.animateWithDuration(animated ? duration : 0.0) {
self.tabBar.frame = CGRectOffset(frame, 0, offsetY)
self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY)
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
}
}
func tabBarIsVisible() ->Bool {
return self.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height
}
}
使用:
self.tabBarController?.setTabBarVisible(visible: false, duration: 0.3, animated: true)
注意 - 此解决方案只是删除隐藏标签栏后留下的白色 space。
隐藏标签栏的最佳解决方案是 - @Michael Campsall answer here
对此最简单的解决方案是更改视图(在我的例子中是 tableView)的底部约束,而不是使用 BottomLayoutGuide 提供底部约束,而使用 superview 提供底部约束。附上截图以供参考。
以下屏幕截图中显示的约束会产生问题,请根据下一张屏幕截图进行更改。
去除白色的实际约束条件 space 应根据此(下方)屏幕截图。
对于那些喜欢以编程方式完成所有事情的人,请将此行添加到 ViewController
的 init
方法中,该方法不应包含 tabBar:
hidesBottomBarWhenPushed = true
以编程方式,将其添加到 swift 4.
的下一个视图控制器
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tabBarController?.tabBar.isHidden = true
edgesForExtendedLayout = UIRectEdge.bottom
extendedLayoutIncludesOpaqueBars = true
}
并添加背景色
有时最简单的方法就是添加一个使用 UIScreen 边界的视图。
let whiteView = UIView()
whiteView.backgroundColor = .white
view.addSubview(whiteView)
whiteView.translatesAutoresizingMaskIntoConstraints = false
whiteView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
whiteView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
whiteView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
whiteView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.height).isActive = true
如果您扩展视图布局,有时视图边缘会超出导航栏,这会给您带来新问题。
此代码适用于 iOS 10、11 和 iPhone X(包括模拟器) show/hide tabBar。我创建了几年(iOS 7 个时间框架?)并且从那时起它一直可靠地工作。
它在 iPhone X 上运行良好,只要您的 childViewControllers(在选项卡中)的内容固定到 topLayoutGuide
、bottomLayoutGuide
或 SafeArea 并且 不是 主视图墙。然后一切正常。享受吧!
@interface UITabBarController (HideTabBar)
@property (nonatomic, getter=isTabBarHidden) BOOL tabBarHidden;
-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated;
@end
@implementation UITabBarController (HideTabBar)
-(BOOL)isTabBarHidden
{
CGRect viewFrame = self.view.frame;
CGRect tabBarFrame = self.tabBar.frame;
return tabBarFrame.origin.y >= viewFrame.size.height;
}
-(void)setTabBarHidden:(BOOL)hidden
{
[self setTabBarHidden:hidden animated:NO];
}
-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated
{
BOOL isHidden = self.tabBarHidden;
if(hidden == isHidden)return;
UIView *transitionView = [[[self.view.subviews reverseObjectEnumerator] allObjects] lastObject];
if(transitionView == nil) {
NSLog(@"UITabBarCategory can't get the container view");
return;
}
CGRect viewFrame = self.view.bounds;
CGRect tabBarFrame = self.tabBar.frame;
CGRect containerFrame = transitionView.frame;
CGRect selectedVCFrame = containerFrame;
tabBarFrame.origin.y = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
containerFrame.size.height = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
if([self.moreNavigationController.viewControllers containsObject:self.selectedViewController]) {
selectedVCFrame = self.selectedViewController.view.frame;
selectedVCFrame.size.height += hidden ? tabBarFrame.size.height : -tabBarFrame.size.height;
}
self.selectedViewController.view.frame = selectedVCFrame;
[UIView animateWithDuration:.5 animations:^{
self.tabBar.frame = tabBarFrame;
transitionView.frame = containerFrame;
[self.selectedViewController.view setNeedsLayout];
}];
}
@end
用法 - 我在 viewController 中对轮换事件这样称呼它:
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
// Hide TabBar on iPhone, iPod Touch
if([UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPad) {
if(_startDateEditor.editing) return;
if(fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || fromInterfaceOrientation == UIInterfaceOrientationPortrait)
[self.tabBarController setTabBarHidden:YES animated:YES];
else
[self.tabBarController setTabBarHidden:NO animated:YES];
}
}
我遇到了同样的问题,根本原因是 BOTTOM CONSTRAINT
确保在主视图层次结构中使用 SUPERVIEW 而非 "SAFE AREA"[=19= 设置 最底部视图 的底部约束]
希望这对某人有所帮助..
您可以参考这个 link - 。为了更好的结果
不要忘记在您的 viewdidLoad() 中添加这行代码,以便在隐藏标签栏后删除黑屏。
if #available(iOS 11.0, *) {
self.myScroll.contentInsetAdjustmentBehavior = .never
}
对于 iOS 13 年的我来说,我必须在单元格中全屏显示图像,我的集合视图具有 trailing, leading, top, bottom
约束。我删除了所有约束。将集合视图框架设置为 UIScreen.main.bounds
。然后 return sizeForItemAt
作为集合帧大小。
尝试将标签栏设置为半透明,然后再隐藏标签栏,当你想再次显示时再次设置为false。
对我有用。
tabBarController?.tabBar.isTranslucent = true
在 Swift 5.4.
中测试
如果您以编程方式将任何 ViewController 的视图添加为子视图而不使用 pushViewController
,那么您可以简单地尝试如下操作:
// When you wanna hide TabBar
tabBarController?.tabBar.isHidden = true
tabBarController?.tabBar.isTranslucent = true // This is the key point!
// When you wanna show TabBar
tabBarController?.tabBar.isHidden = false
tabBarController?.tabBar.isTranslucent = false // This is the key point!
有没有办法隐藏标签栏并删除 space 左边(大约 50px)?
我试过了
self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true
运气不好。我看到空白 space。
this question 上的第三个答案对我来说适用于以下方式:
我的视图控制器上的代码
@IBAction func buttonPressed(sender: AnyObject) {
setTabBarVisible(!tabBarIsVisible(), animated: true)
}
func setTabBarVisible(visible: Bool, animated: Bool) {
// hide tab bar
let frame = self.tabBarController?.tabBar.frame
let height = frame?.size.height
var offsetY = (visible ? -height! : height)
print ("offsetY = \(offsetY)")
// zero duration means no animation
let duration:NSTimeInterval = (animated ? 0.3 : 0.0)
// animate tabBar
if frame != nil {
UIView.animateWithDuration(duration) {
self.tabBarController?.tabBar.frame = CGRectOffset(frame!, 0, offsetY!)
self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY!)
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
return
}
}
}
func tabBarIsVisible() -> Bool {
return self.tabBarController?.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height
}
在情节提要中:
视图控制器主视图背景颜色为黑色:
然后你可以在里面有另一个视图(背景颜色为白色),约束尾部和前导 space 到超级视图,顶部和底部 space 到布局指南。
结果是:
在评论看到你的截图后。我想你可以尝试将 hidesBottomBarWhenPushed
设置为 true.
hidesBottomBarWhenPushed = true
或故事板。
当你推送到另一个视图控制器时它会自动隐藏底部栏,当你返回时它会再次出现。
是的。当您按下查看控制器时,您可以隐藏标签栏。您可以在家中显示标签栏。当你推送到下一个视图控制器时,你可以隐藏你的标签栏。
请参阅下图在推送时隐藏按钮栏,并在所有不需要标签栏的视图控制器中进行设置。
希望对您有所帮助..
如果您仍然在隐藏的标签栏下看到黑色条纹,您是否尝试过 select 在不透明栏下延伸边缘?
还要确保 Under Bottom Bars 仍然是 selected。希望对您有所帮助!
我的首选方法是使用包装控制器。如果我想隐藏标签栏,我只需增加标签栏控制器的高度,从而有效地将标签栏移出屏幕。
使用此解决方案,您无需修改标签栏框架,也无需依赖导航控制器推送动画:
import UIKit
class ViewController: UIViewController {
let tabController: UITabBarController = {
let tabController = UITabBarController()
// setup your tabbar controller here
return tabController;
}()
var tabbarHidden = false {
didSet {
var frame = self.view.bounds;
if (tabbarHidden) {
frame.size.height += self.tabController.tabBar.bounds.size.height;
}
self.tabController.view.frame = frame;
}
}
override func viewDidLoad() {
super.viewDidLoad()
// add the tab controller as child controller
addChildViewController(self.tabController)
self.tabController.view.frame = self.view.bounds
self.tabController.view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
self.view.addSubview(self.tabController.view)
self.tabController.didMoveToParentViewController(self)
// for debugging
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(switchTabbar))
self.tabController.view.addGestureRecognizer(tapRecognizer)
}
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.tabController
}
override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.tabController
}
func switchTabbar() {
UIView.animateWithDuration(0.3) {
self.tabbarHidden = !self.tabbarHidden
}
}
}
Swift 3:
extension UITabBarController {
func setTabBarVisible(visible:Bool, duration: TimeInterval, animated:Bool) {
if (tabBarIsVisible() == visible) { return }
let frame = self.tabBar.frame
let height = frame.size.height
let offsetY = (visible ? -height : height)
// animation
UIViewPropertyAnimator(duration: duration, curve: .linear) {
self.tabBar.frame.offsetBy(dx:0, dy:offsetY)
self.view.frame = CGRect(x:0,y:0,width: self.view.frame.width, height: self.view.frame.height + offsetY)
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
}.startAnimation()
}
func tabBarIsVisible() ->Bool {
return self.tabBar.frame.origin.y < UIScreen.main.bounds.height
}
}
要使用(例如 self
是 UITabBarController
):
self.setTabBarVisible(visible: false, duration: 0.3, animated: true)
Swift 2.x:
extension UITabBarController {
func setTabBarVisible(visible:Bool, duration: NSTimeInterval, animated:Bool) {
if (tabBarIsVisible() == visible) { return }
let frame = self.tabBar.frame
let height = frame.size.height
let offsetY = (visible ? -height : height)
// animation
UIView.animateWithDuration(animated ? duration : 0.0) {
self.tabBar.frame = CGRectOffset(frame, 0, offsetY)
self.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height + offsetY)
self.view.setNeedsDisplay()
self.view.layoutIfNeeded()
}
}
func tabBarIsVisible() ->Bool {
return self.tabBar.frame.origin.y < UIScreen.mainScreen().bounds.height
}
}
使用:
self.tabBarController?.setTabBarVisible(visible: false, duration: 0.3, animated: true)
注意 - 此解决方案只是删除隐藏标签栏后留下的白色 space。
隐藏标签栏的最佳解决方案是 - @Michael Campsall answer here
对此最简单的解决方案是更改视图(在我的例子中是 tableView)的底部约束,而不是使用 BottomLayoutGuide 提供底部约束,而使用 superview 提供底部约束。附上截图以供参考。
以下屏幕截图中显示的约束会产生问题,请根据下一张屏幕截图进行更改。
去除白色的实际约束条件 space 应根据此(下方)屏幕截图。
对于那些喜欢以编程方式完成所有事情的人,请将此行添加到 ViewController
的 init
方法中,该方法不应包含 tabBar:
hidesBottomBarWhenPushed = true
以编程方式,将其添加到 swift 4.
的下一个视图控制器override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tabBarController?.tabBar.isHidden = true
edgesForExtendedLayout = UIRectEdge.bottom
extendedLayoutIncludesOpaqueBars = true
}
并添加背景色
有时最简单的方法就是添加一个使用 UIScreen 边界的视图。
let whiteView = UIView()
whiteView.backgroundColor = .white
view.addSubview(whiteView)
whiteView.translatesAutoresizingMaskIntoConstraints = false
whiteView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
whiteView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
whiteView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
whiteView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.height).isActive = true
如果您扩展视图布局,有时视图边缘会超出导航栏,这会给您带来新问题。
此代码适用于 iOS 10、11 和 iPhone X(包括模拟器) show/hide tabBar。我创建了几年(iOS 7 个时间框架?)并且从那时起它一直可靠地工作。
它在 iPhone X 上运行良好,只要您的 childViewControllers(在选项卡中)的内容固定到 topLayoutGuide
、bottomLayoutGuide
或 SafeArea 并且 不是 主视图墙。然后一切正常。享受吧!
@interface UITabBarController (HideTabBar)
@property (nonatomic, getter=isTabBarHidden) BOOL tabBarHidden;
-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated;
@end
@implementation UITabBarController (HideTabBar)
-(BOOL)isTabBarHidden
{
CGRect viewFrame = self.view.frame;
CGRect tabBarFrame = self.tabBar.frame;
return tabBarFrame.origin.y >= viewFrame.size.height;
}
-(void)setTabBarHidden:(BOOL)hidden
{
[self setTabBarHidden:hidden animated:NO];
}
-(void)setTabBarHidden:(BOOL)hidden animated:(BOOL)animated
{
BOOL isHidden = self.tabBarHidden;
if(hidden == isHidden)return;
UIView *transitionView = [[[self.view.subviews reverseObjectEnumerator] allObjects] lastObject];
if(transitionView == nil) {
NSLog(@"UITabBarCategory can't get the container view");
return;
}
CGRect viewFrame = self.view.bounds;
CGRect tabBarFrame = self.tabBar.frame;
CGRect containerFrame = transitionView.frame;
CGRect selectedVCFrame = containerFrame;
tabBarFrame.origin.y = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
containerFrame.size.height = viewFrame.size.height - (hidden ? 0 : tabBarFrame.size.height);
if([self.moreNavigationController.viewControllers containsObject:self.selectedViewController]) {
selectedVCFrame = self.selectedViewController.view.frame;
selectedVCFrame.size.height += hidden ? tabBarFrame.size.height : -tabBarFrame.size.height;
}
self.selectedViewController.view.frame = selectedVCFrame;
[UIView animateWithDuration:.5 animations:^{
self.tabBar.frame = tabBarFrame;
transitionView.frame = containerFrame;
[self.selectedViewController.view setNeedsLayout];
}];
}
@end
用法 - 我在 viewController 中对轮换事件这样称呼它:
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
// Hide TabBar on iPhone, iPod Touch
if([UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPad) {
if(_startDateEditor.editing) return;
if(fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown || fromInterfaceOrientation == UIInterfaceOrientationPortrait)
[self.tabBarController setTabBarHidden:YES animated:YES];
else
[self.tabBarController setTabBarHidden:NO animated:YES];
}
}
我遇到了同样的问题,根本原因是 BOTTOM CONSTRAINT
确保在主视图层次结构中使用 SUPERVIEW 而非 "SAFE AREA"[=19= 设置 最底部视图 的底部约束]
希望这对某人有所帮助..
您可以参考这个 link -
if #available(iOS 11.0, *) {
self.myScroll.contentInsetAdjustmentBehavior = .never
}
对于 iOS 13 年的我来说,我必须在单元格中全屏显示图像,我的集合视图具有 trailing, leading, top, bottom
约束。我删除了所有约束。将集合视图框架设置为 UIScreen.main.bounds
。然后 return sizeForItemAt
作为集合帧大小。
尝试将标签栏设置为半透明,然后再隐藏标签栏,当你想再次显示时再次设置为false。
对我有用。
tabBarController?.tabBar.isTranslucent = true
在 Swift 5.4.
中测试如果您以编程方式将任何 ViewController 的视图添加为子视图而不使用 pushViewController
,那么您可以简单地尝试如下操作:
// When you wanna hide TabBar
tabBarController?.tabBar.isHidden = true
tabBarController?.tabBar.isTranslucent = true // This is the key point!
// When you wanna show TabBar
tabBarController?.tabBar.isHidden = false
tabBarController?.tabBar.isTranslucent = false // This is the key point!