当导航回父视图控制器-iOS时,UI按钮位于选项卡栏后面

当导航回父视图控制器-iOS时,UI按钮位于选项卡栏后面,ios,objective-c,uibutton,uitabbarcontroller,uitabbar,Ios,Objective C,Uibutton,Uitabbarcontroller,Uitabbar,我有2个ui按钮s,我已将它们放置在我的选项卡上,其中也嵌入了导航控制器 在最后一个ViewController(在导航控制器堆栈中)中,我必须隐藏选项卡栏,我已经成功地实现了这一点 问题是,当我导航回parentViewController时,ui按钮在选项卡栏后面(参见下面的GIF图像): 红色记录按钮和红色“保留”按钮是ui按钮,而不是选项卡按钮 这就是我在我的选项卡视图控制器中添加ui按钮的方式: self.button1 = [UIButton buttonWithType:UIBu

我有2个
ui按钮
s,我已将它们放置在我的
选项卡上,其中也嵌入了导航控制器

在最后一个ViewController(在导航控制器堆栈中)中,我必须隐藏选项卡栏,我已经成功地实现了这一点

问题是,当我导航回
parentViewController
时,
ui按钮
在选项卡栏后面(参见下面的GIF图像):

红色记录按钮和红色“保留”按钮是
ui按钮
,而不是
选项卡按钮

这就是我在我的
选项卡视图控制器中添加
ui按钮的方式:

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];
上述函数返回的
YES
隐藏了选项卡栏,但它使按钮在转到上一个视图控制器时位于选项卡栏后面。 如果我将其更改为
NO
,则按钮不会位于
tabBar
后面,而且
tabBar
不会隐藏在最后一个
viewController

请建议一种方法,或者用另一种方法隐藏tabBar,或者将那些
ui按钮带到前面


谢谢

视图布局时,您是否尝试将按钮置于前面

比如说

self.view.bringSubviewToFront(self.button1)
或者在选项卡栏上方实例化它

self.view.insertSubview(self.button1, aboveSubview: self.tabBar)

当视图布局时,您是否尝试将按钮置于前面

比如说

self.view.bringSubviewToFront(self.button1)
或者在选项卡栏上方实例化它

self.view.insertSubview(self.button1, aboveSubview: self.tabBar)

好了,找到解决办法了!而不是隐藏
选项卡栏

- (BOOL)hidesBottomBarWhenPushed {
    return YES;
}
通过上一个
视图控制器中的
[tabBarController.tabBar setHidden:YES]
隐藏
选项卡栏
。然后在返回时,执行
[tabBarController.tabBar setHidden:NO]视图中的code>将消失


这样,
tabBarController
中的
子视图安排保持不变:)

好的,找到了解决方案!而不是隐藏
选项卡栏

- (BOOL)hidesBottomBarWhenPushed {
    return YES;
}
通过上一个
视图控制器中的
[tabBarController.tabBar setHidden:YES]
隐藏
选项卡栏
。然后在返回时,执行
[tabBarController.tabBar setHidden:NO]视图中的code>将消失


这样,
tabBarController
中的
子视图
排列保持不变:)

尝试了@Sha-answer,此外,这也是我成功运行它的方法 确保在上次查看控制器中添加此代码

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
    }

尝试了@Sha-answer,另外,这也是我成功运行它的原因 确保在上次查看控制器中添加此代码

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
    }

在自定义选项卡栏控制器中添加以下方法,以解决自定义按钮位于选项卡栏后面的问题

目标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
                }
            }
        }
    }
}

它只是有点慢,当视图从“隐藏”更改为“显示”或“显示”更改为“隐藏”时,会有大约0.5秒的延迟。

在自定义选项卡栏控制器中添加以下方法,以解决自定义按钮位于选项卡栏后面的问题

目标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
                }
            }
        }
    }
}

只是有点慢,当视图从“隐藏”更改为“显示”或“显示”更改为“隐藏”时,会有大约0.5秒的延迟。

1.5年前已经提供了答案。如果你觉得有用,请投它一票。谢谢。如果用户可以隐藏视图中的显示,则将显示/视图将消失(self.tabBarController作为?CustomTabbarViewController)?.centerButton?.ishiden=false/true。centerButton在0.5秒延迟时间内工作正常。答案已在1.5年前提供。如果你觉得有用,请投它一票。谢谢。如果用户可以隐藏视图中的显示,则将显示/视图将消失(self.tabBarController作为?CustomTabbarViewController)?.centerButton?.ishiden=false/true。中心按钮在0.5秒延迟时间内工作正常。谢谢!这修复了我们完全相同的问题,一个按钮只有在返回时才被选项卡栏隐藏。谢谢!这修复了我们完全相同的问题,只有在返回时选项卡栏才会隐藏一个按钮。