【问题标题】:Adding custom view above tab bar controller/navigation controller?在标签栏控制器/导航控制器上方添加自定义视图?
【发布时间】:2011-10-12 21:11:55
【问题描述】:

我尝试了以下代码,试图让自定义视图显示在标签栏控制器上方(恰好在所有标签中都有一个导航控制器)。

问题是它覆盖在导航栏的顶部,我希望将导航栏向下移动。

我尝试设置标签栏控制器的框架,但根本没有移动它。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    // Override point for customization after application launch.
    // Add the tab bar controller's current view as a subview of the window
    //self.tabBarController.view.frame = CGRectMake(0, 62, 320, 320);
    self.window.rootViewController = self.tabBarController;

    [self.window makeKeyAndVisible];

    // setting up the header view
    self.headerView = [[HeaderView alloc] initWithFrame:CGRectMake(0, 20, 320, 42)];
    [self.window addSubview:self.headerView];

    // setting up facebook stuff
    AgentSingleton *agentSingleton = [AgentSingleton sharedSingleton];
    agentSingleton.facebook = [[Facebook alloc] initWithAppId:APP_ID];

    return YES;
}

有什么想法吗?

【问题讨论】:

    标签: iphone uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    你的意思是在其余内容的垂直上方吗?

    或高于其他内容?

    有 presentModalViewController:animated: 但我怀疑这就是你想要的?

    【讨论】:

    • 在其余内容的垂直上方。
    • 我把它放在顶部,但现在它覆盖了导航控制器。我需要以某种方式按下标签栏控制器...
    • 使用 modalViewController,其背景视图是当前视图控制器的最顶层视图(类似于 view.superview.superview.superview 直到它为零)
    【解决方案2】:

    实际上没有什么好的方法可以做到这一点。 UINavigationController 和 UITabBarController 的各个子视图都是私有的,试图弄乱它们很可能无法正常工作。而且 Apple 没有为我们提供创建“容器”视图控制器的工具,因此您无法轻松地将 UINavigationController/UITabBarController 嵌入另一个视图控制器或自己重新创建 UINavigationController/UITabBarController。

    您最好的选择可能是继续尝试创建自己的“容器”视图控制器,并处理一些无法正常工作的事情。特别是,包含的视图控制器的parentViewController 将返回 nil,因此包含的视图控制器或其子控制器上的各种其他内容将被破坏(例如,interfaceOrientation 属性将是错误的,presentModalViewController:animated: 可能无法正常工作)。其他东西也可能坏了。

    或者您可以等到某个未来版本的 iOS 真正支持我们创建容器视图控制器(如果有的话),然后仅支持该版本及更高版本。

    【讨论】:

      【解决方案3】:

      你可以简单的 addSubview 到窗口:

      [self.view.window addSubview:myView];
      

      【讨论】:

      • 对我来说,self.view.window 是空的,所以添加子视图没有效果。
      • @Lewis42 并不是说​​这是正确的方法,但在 viewDidLoad 方法内部,窗口属性将始终为零。这需要在 viewDidAppear 方法中完成。
      【解决方案4】:

      将视图添加到 tabBarController 视图本身:

      [self.tabBarController.view addSubview:yourView];
      

      【讨论】:

      • 你拯救了我的一天!
      【解决方案5】:

      你可以这样做:

      if let indeedTabBarController = self.tabBarController {
      
          let buttonHeight: CGFloat = 49 // height of tab bar
          let buttonWidth = UIScreen.main.bounds.width / 3 // in case if you have 3 tabs
          let frame = CGRect(x: 0, y: UIScreen.main.bounds.height - buttonHeight, width: buttonWidth, height: buttonHeight)
          let button = UIButton(frame: frame)
          button.addTarget(self, action: #selector(self.someAction), for: .touchUpInside)
      
          indeedTabBarController.view.addSubview(button)
      }
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,最后做了这样的事情:

        newView.frame = tabBarController.tabBar.frame
        tabBarController.view.addSubview(newView)
        

        将视图添加到 tabBarController 并使用当前标签栏的框架作为新视图的位置就可以了。

        【讨论】:

        • 谢谢,Xcode 11.2.1 iOS 13.1 还是可以的,稍有改动的是第一行,新增视图可以覆盖全屏(包括标签栏) self.newView.frame = self. tabBarController?.view.frame ?? CGRect.zero
        【解决方案7】:
        override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let indeedTabBarController = self.tabBarController {
            let buttonHeight: CGFloat = view.safeAreaInsets.bottom + 44
            let buttonWidth = UIScreen.main.bounds.width
            let frame = CGRect(x: 0, y: UIScreen.main.bounds.height - buttonHeight, width: buttonWidth, height: 44)
            let vw = UIView(frame: frame)
            vw.backgroundColor = .red
            indeedTabBarController.view.addSubview(vw)
          }
        }
        

        【讨论】:

          【解决方案8】:

          对于那些想要添加视图的人,或者在我的情况下是标签栏视图上的指示器视图,这里是 GitHub 上的代码片段,非常容易实现

          预览

          Github 要点

          https://gist.github.com/egzonpllana/cc5538f388d8a530e7c393e7344e57a5

          【讨论】:

          • 您能说明一下您是如何将此 IndicatorView 添加到 UITabBarController 的吗?我应该在该控制器上使用默认的 addSubview 方法吗?我发现该用例存在一个问题。当您推送新的 viewController 时,当您返回主 tabbarcontroller 时,此视图将消失。
          • 嗨 ShadeToD,您是否尝试过我建议的方式,对我来说效果很好。请参阅“//如何使用”处的 github 链接
          • 是的,我已经尝试过您的代码,当您隐藏标签栏或将 hidesBottomBarWhenPushed 设置为 true 时,此添加的视图存在问题。
          • 是的,这可能会发生。一个快速的解决方案是在 viewWillAppear/viewWillDissapper 上添加/删除 tabBar 指示器视图。
          猜你喜欢
          • 1970-01-01
          • 2011-09-18
          • 2019-11-05
          • 2020-05-24
          • 2013-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多