Вы пытались решить проблему с клейкой лентой?
Попробуйте определить, когда возникают ошибки, и исправьте их короткими операторами if, это не очень, но для некоторых проблем это единственное решение, и это один из них .
if( (n * 0.1) < 100.0 ) { return n * 0.1 - 0.000000000000001 ;}
else { return n * 0.1 + 0.000000000000001 ;}
У меня была такая же проблема в проекте научной симуляции в c #, и я могу сказать вам, что если вы проигнорируете эффект бабочки, он превратится в большого толстого дракона и укусит вас в a **
Если вы все еще видите черную полосу под своей скрытой вкладкой, пытаетесь ли вы выбрать Расширить края под непрозрачными барами здесь?
Убедитесь, что 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)
Да. Вы можете скрыть панель вкладок, когда вы нажимаете для просмотра контроллера. Вы можете показать панель вкладок в своем доме. Вы можете скрыть панель вкладок, когда вы нажимаете на следующий контроллер View.
См. Скрыть панель Botton на Push после изображения и установить во всех диспетчерах просмотра, где вы не хотите панель вкладок.
Надеюсь, что это поможет ..
Для тех, кто хочет сделать все программно, добавьте эту строку в метод init
для ViewController
, который не должен иметь tabBar:
hidesBottomBarWhenPushed = true
Этот код работает на iOS 10, 11 и iPhone X (включая симуляторы), чтобы показать / скрыть tabBar. Я создал его несколько лет (временные рамки 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];
}
}
ПРИМЕЧАНИЕ. Это решение состоит в том, чтобы просто удалить пустое пространство после скрытия панели вкладок.
Для скрытия панели вкладок лучшее решение - @Michael Campsall ответ здесь
Самое простое решение - изменить вид (в моем случае его tableView ) нижние ограничения, вместо того, чтобы давать нижние ограничения с помощью BottomLayoutGuide, дают его с надписью. Скриншоты прилагаются для справки.
Ограничения, показанные ниже скриншотами, создают проблему, изменяя ее согласно следующему снимку экрана.
Фактический ограничения для удаления пробелов должны соответствовать этому (ниже) снимку экрана.
Иногда самый простой способ - просто добавить представление, использующее границы 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
Иногда иногда края обзора выходят за пределы панели навигации, что дает вам новые проблемы, если вы расширяете макет представления.
После просмотра скриншота в комментарии. Я думаю, вы можете попробовать установить hidesBottomBarWhenPushed
в true.
hidesBottomBarWhenPushed = true
Или раскадровка.
Он скроет когда вы переместились в другой контроллер представления и снова появляетесь при возврате.
Мой предпочтительный способ сделать это - использовать контроллер упаковки. Если я хочу скрыть панель вкладок, я просто увеличиваю высоту контроллера панели вкладок, таким образом эффективно панель вкладок перемещается из экрана.
С помощью этого решения вам не нужно взламывать вкладку бара, и вы не зависите от анимации 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
}
}
}