开发者

Adding custom view above tab bar controller/navigation controller?

开发者 https://www.devze.com 2023-03-22 15:56 出处:网络
I tried the following code, in an attempt to get the custom view displaying above the tab bar controller (which happens to have a navigation controller within all of it\'s tabs).

I tried the following code, in an attempt to get the custom view displaying above the tab bar controller (which happens to have a navigation controller within all of it's tabs).

The problem is that it overlays on top of the navigation bar, and I want the navigation bar to be moved down.

I tried setting the frame of the tab bar controller, but that didn't move it at all.

- (BOOL)applic开发者_StackOverflow社区ation:(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;
}

Any ideas?


Add the view to the tabBarController View itself:

[self.tabBarController.view addSubview:yourView];


You could simple addSubview to window:

[self.view.window addSubview:myView];


There isn't really any good way to do this. The various subviews of UINavigationController and UITabBarController are both private, and trying to mess with them is likely to not work correctly. And Apple doesn't give us the tools to create "container" view controllers, so you can't easily embed the UINavigationController/UITabBarController inside another view controller or recreate UINavigationController/UITabBarController yourself.

Your best bet is probably to go ahead and try to create your own "container" view controller, and deal with some things not working right. In particular, the contained view controller's parentViewController will return nil, and therefore various other things on the contained view controller or its sub-controllers will be broken (e.g. the interfaceOrientation property will be wrong, presentModalViewController:animated: might not work right). Other things may be broken too.

Or you could wait until some future version of iOS actually has support for us to create container view controllers (if ever), and then support only that version and up.


I had the same problem and ended up doing something like this:

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

Adding the view to the tabBarController and using the frame of the current tabbar as the position of the new view did the trick.


For those who are looking to add a view, or in my case an indicator view over the tab bar view, here is the code snipet on GitHub with very easy implementation.

Preview

Adding custom view above tab bar controller/navigation controller?

Github gist

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


You can do something like that:

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)
}


Do you mean above as in vertically above the rest of the contents?

Or above as in sitting on-top of the rest of the content?

There's presentModalViewController:animated: but I doubt that's what you want?


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)
  }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消