Скрытие панели вкладок и удаление пробела
Есть ли способ скрыть панель вкладок и удалить оставшееся место (около 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
}