【问题标题】:UIButton going behind Tab Bar when navigating back to parent View Controller - iOS导航回父视图控制器时,UIButton 在选项卡栏后面 - iOS
【发布时间】:2016-01-22 13:34:08
【问题描述】:

我有 2 个 UIButtons 放在我的 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,或将 UIButtons 放在前面。

谢谢!

【问题讨论】:

    标签: ios objective-c uibutton uitabbarcontroller uitabbar


    【解决方案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
          }
      

      【讨论】:

        猜你喜欢
        • 2015-10-04
        • 1970-01-01
        • 2016-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多