Подтвердить что ты не робот

Скрытие панели и удаление места

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

Я пробовал

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

Не повезло. Я вижу пустое пространство.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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)

Ответ 3

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

hidesBottomBarWhenPushed = true

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Change constraints shown in this screenshot according to below screenshot

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

enter image description here

Ответ 6

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

Код на контроллере просмотра

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

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

Основной цвет фонового изображения контроллера просмотра - черный цвет: введите описание изображения здесь

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

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

И результат:

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

Ответ 7

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

С помощью этого решения вам не нужно взламывать рамку панели вкладок, и вы не зависите от анимации 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
        }
    }
}

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

Ответ 8

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

hidesBottomBarWhenPushed = true

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

Этот код работает на 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];
    }
}

Ответ 12

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

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

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

Ответ 13

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

if #available(iOS 11.0, *) {
        self.myScroll.contentInsetAdjustmentBehavior = .never
    }