导航回父视图控制器时,UIButton 在选项卡栏后面 - iOS
Posted
技术标签:
【中文标题】导航回父视图控制器时,UIButton 在选项卡栏后面 - iOS【英文标题】:UIButton going behind Tab Bar when navigating back to parent View Controller - iOS 【发布时间】:2016-01-22 13:34:08 【问题描述】:我有 2 个 UIButton
s 放在我的 TabBarViewController
上,(也嵌入了导航控制器)。
在最后一个 ViewController 中(在导航控制器堆栈中),我必须隐藏标签栏,我已经成功实现了。
问题是,当我导航回parentViewController
时,UIButton
位于标签栏后面(请参见下面的 GIF 图片):
红色的记录按钮和红色的“保留”按钮是UIButton
,而不是tabBarButtons
这就是我在tabBarViewController
中添加UIButtons
的方式:
self.button1 = [UIButton buttonWithType:UIButtonTypeCustom];
[self.button1 addTarget:self action:@selector(recordButtonClick:) forControlEvents:UIControlEventTouchUpInside];
self.button1.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
self.button1.frame = CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
[self.button1 setBackgroundImage:[UIImage imageNamed:@"bar_button_record"] forState:UIControlStateNormal];
heightDifference = buttonImage.size.height - self.tabBar.frame.size.height;
if (heightDifference < 0)
self.button1.center = self.tabBar.center;
else
CGPoint center = self.tabBar.center;
center.y = center.y - heightDifference/2.0 - 0;
self.button1.center = center;
[self.view addSubview:self.button1];
另一个红色的“Preserve”按钮也添加了与上面类似的代码。
现在在我的最后一个navigationViewController
中,我通过以下代码隐藏了tabBar
:
#pragma mark - Overriden UIViewController methods, this function gets called automatically when viewController is loaded
- (BOOL)hidesBottomBarWhenPushed
return YES;
上面的函数返回YES
隐藏了tabBar,但它使按钮在tabBar 后面转到以前的视图控制器。
如果我把它改成NO
,那么按钮就不会在tabBar
后面,而且tabBar
也不会隐藏在最后一个viewController
上。
请建议一种方法,以其他方式隐藏 tabBar,或将 UIButton
s 放在前面。
谢谢!
【问题讨论】:
【参考方案1】:好的,找到了解决方案!而不是隐藏tabBar
- (BOOL)hidesBottomBarWhenPushed
return YES;
在最后一个viewController
中隐藏tabBar
by [tabBarController.tabBar setHidden:YES]
。然后在返回时,在viewWillDisappear
中执行[tabBarController.tabBar setHidden:NO];
。
这样tabBarController
中的subviews
排列保持不变:)
【讨论】:
谢谢!这解决了我们完全相同的问题,即仅在导航返回时按钮被标签栏隐藏。【参考方案2】:在您的自定义标签栏控制器中添加以下方法以解决您的自定义按钮位于标签栏后面的问题。
Objective-C 代码:
-(void)viewDidLayoutSubviews
if (self.centerButton != nil)
[self.view bringSubviewToFront:self.centerButton];
for (UIView *vw in self.view.subviews)
if ([vw isKindOfClass:[UITabBar class]])
if(vw.hidden)
self.centerButton.hidden = true;
else
self.centerButton.hidden = false;
Swift 代码:
override func viewDidLayoutSubviews()
if self.centerButton != nil
self.view.bringSubview(toFront: self.centerButton)
for vw in self.view.subviews
if let subView = vw as? UITabBar
if subView.isHidden == true
self.centerButton.isHidden = true
else
self.centerButton.isHidden = false
就是有点慢,view从hide到show或者show到hide之间会有0.5秒左右的延迟。
【讨论】:
答案已在 1.5 年前提供。如果觉得有用请点赞。谢谢。 如果用户可以在 viewWillAppear/viewWillDisappear 中隐藏显示 (self.tabBarController as?CustomTabbarViewController)?.centerButton?.isHidden = false/true。 centerButton 工作完美,没有 0.5 秒的延迟时间。【参考方案3】:您是否尝试在视图布局时将按钮放在前面?
例如
self.view.bringSubviewToFront(self.button1)
或者在tabBar上方实例化它
self.view.insertSubview(self.button1, aboveSubview: self.tabBar)
【讨论】:
【参考方案4】:尝试了@Sha 的答案,另外这就是我为运行它成功所做的。 确保在 Last ViewController
中添加此代码var tabbarViewController: tabbarViewController?
var tabbarHoldonFrame = CGRect()
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
self.hideTabbar()
func hideTabbar()
// get instance of tabbar controller
tabbarViewController = self.navigationController?.tabBarController as? tabbarViewController
// hide tabbar
tabbarViewController?.tabBar.isHidden = true
// hide your additional button placed above tabbar
tabbarViewController?.buttonCreateContest.isHidden = true
// hold it's frame in tabbarHoldonFrame, set zero temporarily
tabbarHoldonFrame = (tabbarViewController?.tabBar.frame)!
tabbarViewController?.tabBar.frame = CGRect.zero
override func viewWillDisappear(_ animated: Bool)
self.showTabbar()
func showTabbar()
// show it
tabbarViewController?.tabBar.isHidden = false
// show your button
tabbarViewController?.buttonCreateContest.isHidden = false
// add default frame
tabbarViewController?.tabBar.frame = tabbarHoldonFrame
【讨论】:
以上是关于导航回父视图控制器时,UIButton 在选项卡栏后面 - iOS的主要内容,如果未能解决你的问题,请参考以下文章
将选项卡栏控制器嵌入导航控制器时的 prepareForSegue
在每个选项卡错误处使用导航控制器从视图控制器转换到选项卡栏控制器
在三个视图控制器之间导航,其中三个视图控制器都在一个选项卡栏视图中