将UITabBar定位在顶部

时间:2015-04-11 16:07:02

标签: ios objective-c swift uitabbar

我是iOS开发的初学者。我的问题是:是否可以将UITabBar放在顶部以及如何定位? 我不能将我的UITabBar放在视图的顶部。

9 个答案:

答案 0 :(得分:34)

有可能吗?当然,但它违反了人机界面指南。

截图:

Portrait Landscape Storyboard

代码:

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

答案 1 :(得分:7)

Swift3:我是通过为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)
    }

不要忘记将自定义类设置为TabBarController enter image description here

结果如下:

enter image description here

答案 2 :(得分:6)

这是aviatorken89代码的一个有效的快速示例。

  1. 首先创建一个新文件。
  2. 选择源cocoa touch class。
  3. 指定子类:UITabBarController
  4. 将类命名为&#34; CustomTabBarController&#34;或者你想要的任何东西。
  5. 将以下代码添加到课程中。

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        var tabFrame:CGRect = self.tabBar.frame
        tabFrame.origin.y = self.view.frame.origin.y
        self.tabBar.frame = tabFrame
    }
    
  6. 如果您使用的是故事板,请务必通过&#34;身份检查器&#34;将标签栏类更改为您的自定义类。

答案 3 :(得分:3)

雨燕5

将此代码添加到您的UITabBarViewController;

  override func viewDidLayoutSubviews() {
    let height = navigationController?.navigationBar.frame.maxY
    tabBar.frame = CGRect(x: 0, y: height ?? 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
    super.viewDidLayoutSubviews()
  }

它适用于iOS> 13和iOS <13

答案 4 :(得分:2)

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
}

storyboard enter image description here

更新IOS 11问题

上面的代码在ios 11上不起作用。所以这是我找到的解决方法。

override func viewDidLayoutSubviews() {
    tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)

    super.viewDidLayoutSubviews()
}

答案 5 :(得分:1)

您可以自己创建一个自定义标签栏,但Apple非常不鼓励模仿最初不打算执行的功能的系统控件。

我再次阻止您这样做,因为它违反了您的应用和系统应用的一致性。但是,既然我在这,我们走了:

对于自定义标签栏,您需要创建一个包含多个按钮的视图。您还需要一个容器视图以下 UITabBar(因为您希望UITabBar位于顶部)。按下按钮时,您可以更改容器内的UIViewController
它很简单,但当然强烈不推荐。

答案 6 :(得分:1)

TabbarController的

子视图隐藏在Tabbar的背面。 因此,请使用以下代码进行修复:

class CustomTabBarController: UITabBarController ,UITabBarControllerDelegate{

    override func viewDidLayoutSubviews() {
        tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
        super.viewDidLayoutSubviews()
        delegate = self
        selectedViewController?.view.frame.origin = CGPoint(x: 0, y: tabBar.frame.size.height)
    }

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
          selectedViewController?.view.frame.origin = CGPoint(x: 0, y: tabBar.frame.size.height)
    }

}

答案 7 :(得分:1)

更新到xCode 11.5之后。在我的控制器中添加了此代码。工作iOS 13

override func viewWillLayoutSubviews() {
        renderTabPosition()
        super.viewWillLayoutSubviews()
    }
private func renderTabPosition() {
        tabBar.frame = CGRect(x: 0, y: 0, width: tabBar.frame.size.width, height: tabBar.frame.size.height + 5)        
}

答案 8 :(得分:-2)

如果你想要一个类似UITabBar的东西,那么你如何创建一个自定义UIView并在其中添加任意数量的UIButtons。然后通过Segue将一些ViewControllers与每个按钮链接起来。完成!

您不需要自定义UITabBar。正如aviatorken89之前所说的那样,它违反了人机界面准则。