Скрытие панели вкладок и удаление пробела

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

Я старался

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

Неудачно. Я вижу пустое пространство.

16 ответов

Решение

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

Удостоверьтесь также, что Under Bottom Bars по-прежнему выбран. Надеюсь, поможет!

Свифт 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 к истине.

hidesBottomBarWhenPushed = true

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

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

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

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

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

ПРИМЕЧАНИЕ. - Это решение состоит в том, чтобы просто удалить пустое пространство, оставшееся после скрытия панели вкладок.

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

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

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

Измените ограничения, показанные на этом скриншоте, согласно скриншоту ниже

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

введите описание изображения здесь

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

hidesBottomBarWhenPushed = true

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

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

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

введите описание изображения здесь

Я столкнулся с той же проблемой, и основной причиной было НИЖНЕЕ ОГРАНИЧЕНИЕ

Убедитесь, что вы установили нижнее ограничение вашего самого нижнего вида в иерархии основного представления с помощью SUPERVIEW, а не "БЕЗОПАСНОЙ ОБЛАСТИ"

Надеюсь, это поможет кому-то..

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

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

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

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

Цвет фона основного вида контроллера представления - черный:

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

И результат:

Протестировано в 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!

попробуйте установить полупрозрачность панели вкладок до того, как вы снова скроете панель вкладок, для которой установлено значение false, когда вы хотите снова отобразить.

меня устраивает.

      tabBarController?.tabBar.isTranslucent = true

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

Посмотрите на кнопку "Скрыть нижнюю панель" на Push- изображении и установите во всех контроллерах вида, где вы не хотите панель вкладок.

Надеюсь, поможет..

Иногда этот самый простой способ - просто добавить представление, использующее границы 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];
    }
}

Для меня в iOS 13 мне приходилось отображать изображение в ячейке в полноэкранном режиме, у меня был просмотр коллекции с trailing, leading, top, bottomограничение. Я снял все ограничения. установить рамку просмотра коллекции наUIScreen.main.bounds. затем вернисьsizeForItemAt как размер рамы коллекции.

Вы можете обратиться по этой ссылке - iOS / Swift - Скрыть / Показать UITabBarController при прокрутке вниз / вверх. Для лучшего результата Не забудьте добавить эту строку кода в ваш viewdidLoad() для удаления черного экрана после скрытия панели вкладок.

if #available(iOS 11.0, *) {
        self.myScroll.contentInsetAdjustmentBehavior = .never
    }
Другие вопросы по тегам