Скрывая tabbar и удаление пространство

есть ли способ скрыть панель вкладок и удалить оставшееся пространство (около 50px) ?

пробовал

self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true

Не повезло. Я вижу пустое место.

11 ответов


Если вы все еще видите черную полосу под скрытой панелью вкладок, вы пытались выбрать Расширьте Края Под Непрозрачными Барами здесь?

enter image description here

убедитесь также, что Под Нижними Барами по-прежнему выбран. Надеюсь, это поможет!


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)

после увидел ваш скриншот в комментарии. Я думаю, вы можете попробовать указать hidesBottomBarWhenPushed в true.

hidesBottomBarWhenPushed = true

или раскадровки.

enter image description here

он автоматически скроет нижнюю панель, когда вы нажмете на другой контроллер вида, и появится снова, когда вы вернетесь.


третий ответ на этот вопрос работает для меня следующим образом:

код на моем контроллере вида

@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
}

в раскадровке:

контроллер вида основной вид цвет фона черный цвет: enter image description here

тогда у вас может быть другой вид внутри (цвет фона белый), ограниченное конечное и ведущее пространство для просмотра и верхнее и нижнее пространство для руководства по компоновке.

enter image description here

в результате:

enter image description here


мой предпочтительный способ сделать это-использовать контроллер упаковки. Если я хочу скрыть панель вкладок, я просто увеличиваю высоту контроллера панели вкладок, таким образом, панель вкладок перемещается из экрана.

С помощью этого решения вам не нужно взломать рамку панели вкладок, и вы не зависите от навигационного контроллера push-анимации:

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
        }
    }
}

enter image description here


Примечание - это решение состоит в том, чтобы просто удалить пробел, оставшийся после скрытия панели вкладок.

для скрытия панели вкладок лучшим решением является - @Michael Campsall ответ тут

самое простое решение этого-изменить нижние ограничения вашего представления(в моем случае его tableView), вместо того, чтобы давать нижние ограничения с BottomLayoutGuide, дайте его с superview. Скриншоты прилагаются для справки.

ограничения, показанные ниже скриншоты создают проблему, измените ее в соответствии со следующим скриншотом.

Change constraints shown in this screenshot according to below screenshot

фактические ограничения для удаления пробела должны соответствовать этому (ниже) скриншоту.

enter image description here


программно добавьте это к следующему контроллеру представления для swift 4.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tabBarController?.tabBar.isHidden = true
    edgesForExtendedLayout = UIRectEdge.bottom
    extendedLayoutIncludesOpaqueBars = true
}

и добавить цвет фона


да. Вы можете скрыть панель вкладок при нажатии для просмотра контроллера. Вы можете показать панель вкладок в своем доме. Вы можете скрыть панель вкладок при нажатии на следующий контроллер вида.

посмотреть скрыть Botton Bar на Push следующее изображение и установить во всех viewcontrollers, где вы не хотите, чтобы панель вкладок.

enter image description here

надеюсь, что это помогает..


для тех, кто любит делать все программно, добавьте эту строку в тег init метод a ViewController у этого не должно быть таббара:

hidesBottomBarWhenPushed = 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 (включая тренажеры) для показать/скрыть панель вкладок. Я создал его несколько лет (временные рамки 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];
    }
}