Positioning UITabBar at the top
Is it possible? Sure, but it violates the human interface guidelines.
Screenshots:
Code:
TabController.h:
#import <UIKit/UIKit.h>@interface TabController : UITabBarController <UITabBarControllerDelegate>@end
TabController.m:
#import "TabController.h"@interface TabController ()@end@implementation TabController- (void)viewDidLoad{ [super viewDidLoad]; self.delegate = self;}- (void)viewWillLayoutSubviews{ [super viewWillLayoutSubviews]; [self.tabBar invalidateIntrinsicContentSize]; CGFloat tabSize = 44.0; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if (UIInterfaceOrientationIsLandscape(orientation)) { tabSize = 32.0; } CGRect tabFrame = self.tabBar.frame; tabFrame.size.height = tabSize; tabFrame.origin.y = self.view.frame.origin.y; self.tabBar.frame = tabFrame; // Set the translucent property to NO then back to YES to // force the UITabBar to reblur, otherwise part of the // new frame will be completely transparent if we rotate // from a landscape orientation to a portrait orientation. self.tabBar.translucent = NO; self.tabBar.translucent = YES;}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning];}@end
Swift3: I achieve this by creating a custom class for UITabBarController
:
class CustomTabBarController: UITabBarController { @IBOutlet weak var financialTabBar: UITabBar! override func viewDidLoad() { super.viewDidLoad() // I've added this line to viewDidLoad UIApplication.shared.statusBarFrame.size.height financialTabBar.frame = CGRect(x: 0, y: financialTabBar.frame.size.height, width: financialTabBar.frame.size.width, height: financialTabBar.frame.size.height) }
Don't forget to set your Custom Class to TabBarController
The result would be like this:
Here is a working swift 3 example of aviatorken89's code.
- First create a new file.
- Select source cocoa touch class.
- Designate subclass of: UITabBarController
- Name the class "CustomTabBarController" or whatever you'd like.
Add the following code to the class.
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() var tabFrame:CGRect = self.tabBar.frame tabFrame.origin.y = self.view.frame.origin.y self.tabBar.frame = tabFrame}
If you are using storyboard make sure to change the tab bar class to your custom class via the "Identity inspector".