[英]Change UITabBar height
我使用
UITabBarController<\/code>作為根視圖,應用程序支持 iOS 6 及更高版本。
項目類層次結構如下。
UITabBarController
- tab1
- UINavigationController
- UIViewController
- UIViewController
.
.
- tab2
- UINavigationController
- UIViewController
- UIViewController
.
.
.
- tab3
- UIViewController
- tab4
- UIViewController
我遇到了這個問題,我能夠解決它。
您必須將以下代碼添加到UITabBarController
類的子類中。
const CGFloat kBarHeight = 80;
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
CGRect tabFrame = self.tabBar.frame; //self.TabBar is IBOutlet of your TabBar
tabFrame.size.height = kBarHeight;
tabFrame.origin.y = self.view.frame.size.height - kBarHeight;
self.tabBar.frame = tabFrame;
}
迅速:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tabBar.frame.size.height = kBarHeight
tabBar.frame.origin.y = view.frame.height - kBarHeight
}
對於iOS 8.2 、 Xcode 6.2 Swift 語言:
為您的UITabBarController
(類型UITabBarController
)創建一個“DNMainTabVC.swift”(DeveloperNameMainTabViewController.swift 文件)並將其連接到您的故事板 VC。
添加以下幾行:
override func viewWillLayoutSubviews() {
var tabFrame = self.tabBar.frame
// - 40 is editable , the default value is 49 px, below lowers the tabbar and above increases the tab bar size
tabFrame.size.height = 40
tabFrame.origin.y = self.view.frame.size.height - 40
self.tabBar.frame = tabFrame
}
這對我有用。
Swift3.0、Swift 4.0 兼容
iPhone X 之前的默認標簽欄高度: 49pt
iPhone X默認標簽欄高度: 83pt
支持包括iPhone X屏幕尺寸在內的所有 iOS 設備的通用解決方案如下所示:
捕獲 UITabBar 的默認高度:
fileprivate lazy var defaultTabBarHeight = { tabBar.frame.size.height }()
調整 UITabBar 的高度:
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() let newTabBarHeight = defaultTabBarHeight + 16.0 var newFrame = tabBar.frame newFrame.size.height = newTabBarHeight newFrame.origin.y = view.frame.size.height - newTabBarHeight tabBar.frame = newFrame }
在XCode 9.0和Swift 4 中測試
正如之前的答案所建議的那樣 - 繼承UITabBar
並覆蓋sizeThatFits
,但將height
標記為@IBInspectable
,因此它可以在Interface Builder 中設置:
import UIKit
class CustomTabBar : UITabBar {
@IBInspectable var height: CGFloat = 0.0
override func sizeThatFits(_ size: CGSize) -> CGSize {
var sizeThatFits = super.sizeThatFits(size)
if height > 0.0 {
sizeThatFits.height = height
}
return sizeThatFits
}
}
在Identity Inspector (⌥⌘3) 中為UITabBar
設置CustomTabBar
類:
然后在屬性檢查器(⌥⌘4) 中設置所需的Height
(大於0.0
):
創建一個UITabBar
類型的自定義子類,然后實現以下方法:
@implementation CustomTabBar
#define kTabBarHeight = // Input the height we want to set for Tabbar here
-(CGSize)sizeThatFits:(CGSize)size
{
CGSize sizeThatFits = [super sizeThatFits:size];
sizeThatFits.height = kTabBarHeight;
return sizeThatFits;
}
@end
希望這會奏效。
對於 Swift 4
extension UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 60 // adjust your size here
return sizeThatFits
}
}
斯威夫特 2.0:
var tabBar:UITabBar?
override func viewWillLayoutSubviews() {
var tabFrame: CGRect = self.tabBar!.frame
tabFrame.size.height = 60
tabFrame.origin.y = self.view.frame.size.height - 60
self.tabBar!.frame = tabFrame
}
Swift 3.0+在下面的代碼中將 200 替換為您想要的高度。
extension UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: UIScreen.main.bounds.width, height: 200)
}
}
Swift 4 & 兼容 iphone x
class CustomTabBar : UITabBar {
@IBInspectable var height: CGFloat = 65.0
override open func sizeThatFits(_ size: CGSize) -> CGSize {
guard let window = UIApplication.shared.keyWindow else {
return super.sizeThatFits(size)
}
var sizeThatFits = super.sizeThatFits(size)
if height > 0.0 {
if #available(iOS 11.0, *) {
sizeThatFits.height = height + window.safeAreaInsets.bottom
} else {
sizeThatFits.height = height
}
}
return sizeThatFits
}
}
建立在以前的答案的基礎上,並針對 Swift 3 進行更新。
子類化 UITabController 並確保將新的自定義類分配給 UITabController 的 Identity Inspector。
斯威夫特 3.0
class MainTabBarController: UITabBarController {
override func viewWillLayoutSubviews() {
var newTabBarFrame = tabBar.frame
let newTabBarHeight: CGFloat = 60
newTabBarFrame.size.height = newTabBarHeight
newTabBarFrame.origin.y = self.view.frame.size.height - newTabBarHeight
tabBar.frame = newTabBarFrame
}
}
警告:如果在標簽欄下方有一個空白區域,請確保將此代碼放在 viewWillLayoutSubviews() 而不是 viewDidLoad() 中。
出於某種原因,@Rushikesh 的答案在iOS 10之前一直運行良好,但我在iOS 11和Swift 3.2 上遇到了一些問題。
每次我觸摸一個新標簽時,tabBar 都會改變它的框架。
我通過將代碼放在viewDidLayoutSubviews()
函數而不是viewWillLayoutSubviews()
斯威夫特 3:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var tabFrame = tabBar.frame
tabFrame.size.height = 65
tabFrame.origin.y = view.frame.size.height - 65
tabBar.frame = tabFrame
}
Xamarin 實現:
public override void ViewWillLayoutSubviews()
{
base.ViewWillLayoutSubviews();
const float newTabBarHeight = 40f;
TabBar.Frame = new CGRect(TabBar.Frame.X, TabBar.Frame.Y + (TabBar.Frame.Height - newTabBarHeight), TabBar.Frame.Width, newTabBarHeight);
}
使用安全區域編輯 Kiarash Asar 的答案:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
var safeAreaBottomInset: CGFloat = 0.0
if #available(iOS 11.0, *) {
safeAreaBottomInset = view.safeAreaInsets.bottom
}
let newTabBarHeight: CGFloat = {{myDesiredHeight}} + safeAreaBottomInset
var newFrame = tabBar.frame
newFrame.size.height = newTabBarHeight
newFrame.origin.y = view.frame.size.height - newTabBarHeight
tabBar.frame = newFrame
}
您可以通過子類化來修改標簽欄的高度。 我其實很久以前就這樣做了。 Xcode 6.0
override func sizeThatFits(_ size: CGSize) -> CGSize {
return CGSize(width: super.sizeThatFits(size).width, height: 60)
}
這應該返回其默認寬度和 60pts 的高度。
這也是一種方法
extension UITabBar {
override public func sizeThatFits(size: CGSize) -> CGSize {
super.sizeThatFits(size)
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 71 // or whatever height you need
return sizeThatFits
}
}
適用於所有屏幕尺寸:將 tabBarHeight 設置為(tabBar 的原始高度 - 20)這很重要,因此您可以稍后在 viewDidLayoutSubviews 中使用它,也比硬編碼您想要的尺寸更好。 由於該尺寸可能不適用於所有屏幕。
窗口安全區域插入在標簽欄高度的底部保留必要的填充,以保持與屏幕底部邊緣的距離。
var tabBarHeight = CGFloat()
override func viewDidLoad() {
super.viewDidLoad()
tabBarHeight = self.tabBar.frame.height - 20
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var tabFrame = self.tabBar.frame
guard let window = UIApplication.shared.keyWindow else {return}
tabFrame.size.height = tabBarHeight + window.safeAreaInsets.bottom
self.tabBar.frame = tabFrame
}
Swift 5.3.1、XCode 11+、iOS 14:
import UIKit
class CustomTabBar: UITabBar {
let height: CGFloat = 62
override open func sizeThatFits(_ size: CGSize) -> CGSize {
guard let window = UIApplication.shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first else {
return super.sizeThatFits(size)
}
var sizeThatFits = super.sizeThatFits(size)
if #available(iOS 11.0, *) {
sizeThatFits.height = height + window.safeAreaInsets.bottom
} else {
sizeThatFits.height = height
}
return sizeThatFits
}
}
iPhoneX 有不同的高度,所以如果我們移動到較小的高度,那么 iPhoneX 中的標簽欄形狀會很糟糕
- (void)viewWillLayoutSubviews
{
int requiredHeight = 55;
CGRect tabFrame = self.tabBar.frame;
if (tabFrame.size.height < requiredHeight)
{
tabFrame.size.height = requiredHeight;
tabFrame.origin.y = self.view.frame.size.height - requiredHeight;
self.tabBar.frame = tabFrame;
}
}
class TabBarVC: UITabBarController {
//MARK:- Variable
let HEIGHT_TAB_BAR:CGFloat = 500
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var tabFrame = self.tabBar.frame
tabFrame.size.height = HEIGHT_TAB_BAR
tabFrame.origin.y = self.view.frame.size.height - HEIGHT_TAB_BAR
self.tabBar.frame = tabFrame
}
}
對我來說效果很好。
對於 UITabBarController 子類<\/strong>
從 UITabBar 創建一個子類
class CustomTabBar : UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
super.sizeThatFits(size)
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 200
return sizeThatFits
}
}
它幫助了我
override func viewDidLayoutSubviews() {
super.viewWillLayoutSubviews()
tabBar.frame.size.height = 60
tabBar.frame.origin.y = view.frame.height - 60
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.