Ios 将UITabBar定位在顶部

Ios 将UITabBar定位在顶部,ios,objective-c,swift,uitabbar,Ios,Objective C,Swift,Uitabbar,我是iOS开发的初学者。我的问题是:是否有可能将UITabBar定位在顶端,以及如何定位? 我无法将我的UITabBar放在视图的顶部。你可以自己创建一个自定义选项卡栏,但苹果公司强烈反对模仿系统控件来实现原本不打算实现的功能 我再次劝阻您这样做,因为这违反了您的应用程序和系统应用程序的一致性。但既然我在做这件事,我们就开始: 对于自定义选项卡栏,需要创建包含多个按钮的视图。您还需要uitabar下方的容器视图(因为您希望uitabar位于顶部)。按下按钮时,您可以更改容器内的UIViewCon

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

你可以自己创建一个自定义选项卡栏,但苹果公司强烈反对模仿系统控件来实现原本不打算实现的功能

我再次劝阻您这样做,因为这违反了您的应用程序和系统应用程序的一致性。但既然我在做这件事,我们就开始:

对于自定义选项卡栏,需要创建包含多个按钮的视图。您还需要
uitabar
下方的容器视图(因为您希望
uitabar
位于顶部)。按下按钮时,您可以更改容器内的
UIViewController


这很简单,但当然,强烈建议不要这样做。

可能吗?当然,但它违反了人机界面准则

截图:

代码: TabController.h:

#import <UIKit/UIKit.h>

@interface TabController : UITabBarController <UITabBarControllerDelegate>

@end

如果您希望在顶部有一个类似UIAbbar的东西,那么创建一个自定义UIView并在其中添加任意数量的UIButton如何。然后通过Segue将一些ViewController与每个按钮链接。完成了


您不需要定制UtiAbar。正如aviatorken89之前所说,这违反了人机界面准则。

这里是aviatorken89代码的swift 3示例

  • 首先创建一个新文件
  • 选择源类别
  • 指定子类:UITabBarController
  • 将类命名为“CustomTabBarController”或任何您想要的名称
  • 将以下代码添加到类中

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        var tabFrame:CGRect = self.tabBar.frame
        tabFrame.origin.y = self.view.frame.origin.y
        self.tabBar.frame = tabFrame
    }
    
  • 如果您正在使用故事板,请确保通过“标识检查器”将选项卡栏类更改为自定义类


  • 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

    结果如下:

    更新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()
    }
    

    Tabbar控制器的子视图隐藏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)
        }
    
    }
    
    斯威夫特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()
      }
    

    更新到xCode 11.5后,它适用于iOS>13和iOS<13

    。在我的控制器中添加了此代码。工作指令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)        
    }
    

    感谢aviatorKen89,我尝试在objective-c中创建(android片段),这就是为什么我在顶部显示选项卡栏没有问题;如果这段代码对你有帮助,请接受答案:)这是我可以通过其他方法做到的吗?@AlgroDev我猜你是一名即将加入iOS的Android开发人员。要记住的东西ios!=安卓它们是两个完全不同的操作系统。你可能有一些可以在android上运行的东西,但这并不意味着它可以在iOS上运行。事实上,它可能与iOS完全冲突。在iOS中,用户希望选项卡栏位于底部,导航栏位于顶部。请注意,不要因为向用户展示如此意外的东西而让他们感到不快。有人能告诉我,在HIG中,标签栏必须在底部的什么位置吗?谢谢,那么我该如何使用(android片段)在ios中?你不应该这样做。@Fogmeister为什么不这样做?像一个角色一样工作这造成的问题是视图控制器不知道选项卡栏控制器被移动到顶部。所以视图没有正确的定位。你能解释一下如何在iPhoneX上实现这一点吗@助记符23我认为与其他iphone一样在故事板上创建UITabBarController-将其子类化。比如说“TabViewController”-像上面的代码一样,在子类内部设置tabBar.frame。您是如何在选中tab按钮时使其下划线呈绿色的?谢谢。请提供此“违反人机界面指南”的支持链接。第一次显示屏幕时,此链接运行良好,但是当您转到另一个屏幕时,将其弹出回此屏幕,它会撤消您最初设置的所有内容。你是如何解决这个问题的?你是说它适用于除iOS 13以外的所有应用程序吗?
      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()
      }
    
    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)        
    }