Есть ли способ скрыть вкладку и удалить это пространство влево (около 50 пикселей)?
Я пробовал
self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true
Не повезло. Я вижу пустое пространство.
Есть ли способ скрыть вкладку и удалить это пространство влево (около 50 пикселей)?
Я пробовал
self.tabBarController?.tabBar.hidden = true
self.extendedLayoutIncludesOpaqueBars = true
Не повезло. Я вижу пустое пространство.
Если вы все еще видите черную полосу под своей скрытой вкладкой, попробовали ли вы здесь выбрать "Расширить края под непрозрачными барами"?
Убедитесь, что Under Bottom Bars все еще выбран. Надеюсь, это поможет!
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
Или раскадровка.
Он автоматически скроет нижнюю панель, когда вы перейдете к другому контроллеру представления, и снова вернетесь, когда вернетесь.
Программно добавьте это к следующему контроллеру представления для быстрого 4.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tabBarController?.tabBar.isHidden = true
edgesForExtendedLayout = UIRectEdge.bottom
extendedLayoutIncludesOpaqueBars = true
}
И добавьте цвет фона
ПРИМЕЧАНИЕ. - Это решение состоит в том, чтобы просто удалить пустое пространство, оставшееся после скрытия панели вкладок.
Для скрытия панели вкладок лучшее решение - ответ @Michael Campsall здесь
Самое простое решение этого - изменить нижние ограничения вашего представления (в моем случае - tableView) вместо того, чтобы задавать нижние ограничения с помощью BottomLayoutGuide, чтобы придать ему суперпредставление. Скриншоты прилагаются для справки.
Ограничения, показанные на скриншотах ниже, создают проблему, измените ее согласно следующему скриншоту.
Фактические ограничения для удаления пробелов должны соответствовать этому (ниже) скриншоту.
Третий ответ на этот вопрос работает для меня следующим образом:
Код на контроллере просмотра
@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
}
В раскадровке:
Основной цвет фонового изображения контроллера просмотра - черный цвет:
Затем вы можете иметь другое представление внутри (цвет фона белый), ограниченное конечное и ведущее пространство для просмотра, а также верхнее и нижнее пространство в руководстве по компоновке.
И результат:
Мой предпочтительный способ сделать это - использовать контроллер упаковки. Если я хочу скрыть панель вкладок, я просто увеличиваю высоту контроллера панели вкладок, таким образом эффективно панель вкладок перемещается из экрана.
С помощью этого решения вам не нужно взламывать рамку панели вкладок, и вы не зависите от анимации 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
}
}
}
Для тех, кто хочет сделать все программно, добавьте эту строку в метод init
для ViewController
, который не должен иметь tabBar:
hidesBottomBarWhenPushed = true
Да. Вы можете скрыть панель вкладок, когда вы нажимаете для просмотра контроллера. Вы можете показать панель вкладок в своем доме. Вы можете скрыть панель вкладок, когда вы нажимаете на следующий контроллер View.
Посмотрите на Скрыть панель Botton на 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];
}
}
Я столкнулся с той же проблемой, и основной причиной было НИЖНЕЕ ОГРАНИЧЕНИЕ
Убедитесь, что вы установили нижнее ограничение вашего самого нижнего вида в иерархии основного представления с помощью SUPERVIEW, а не "БЕЗОПАСНОЙ ОБЛАСТИ"
Надеюсь, это поможет кому-то..
Вы можете обратиться по этой ссылке - iOS/Swift - Скрыть/Показать UITabBarController при прокрутке вниз/вверх. Для лучшего результата Не забудьте добавить эту строку кода в ваш viewdidLoad() для удаления черного экрана после скрытия панели вкладок.
if #available(iOS 11.0, *) {
self.myScroll.contentInsetAdjustmentBehavior = .never
}