我是iOS开发的初学者。我的问题是:是否可以将UITabBar放在顶部以及如何定位? 我不能将我的UITabBar放在视图的顶部。
答案 0 :(得分:34)
有可能吗?当然,但它违反了人机界面指南。
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)
}
结果如下:
答案 2 :(得分:6)
这是aviatorken89代码的一个有效的快速示例。
将以下代码添加到课程中。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
var tabFrame:CGRect = self.tabBar.frame
tabFrame.origin.y = self.view.frame.origin.y
self.tabBar.frame = tabFrame
}
如果您使用的是故事板,请务必通过&#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)
}
更新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)
子视图隐藏在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之前所说的那样,它违反了人机界面准则。